超文本传输协议(Hypertext Transfer Protocol、HTTP 协议)是今天使用最广泛的应用层协议,1989 年由 Tim Berners-Lee 在 CERN 起草的协议已经成为了互联网的数据传输的核心1。在过去几年的时间里,HTTP/2 和 HTTP/3 也对现有的协议进行了更新,提供更加安全和快速的传输功能。多数的编程语言都会在标准库中实现 HTTP/1.1 和 HTTP/2.0 已满足工程师的日常开发需求,今天要介绍的 Go 语言的网络库也实现了这两个大版本的 HTTP 协议。
9.2.1 设计原理
HTTP 协议是应用层协议,在通常情况下我们都会使用 TCP 作为底层的传输层协议传输数据包,但是 HTTP/3 在 UDP 协议上实现了新的传输层协议 QUIC 并使用 QUIC 传输数据,这也意味着 HTTP 既可以跑在 TCP 上,也可以跑在 UDP 上。
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAADYCAYAAADoKyV3AAAgAElEQVR4nO3deXAc12Hv++/p7tkH+w4C3CluIkVKlLVYm23Jm7w78b7EufZ1FuclqZd6qUrVq5dXt+6t3GwvuY4d3zix5T2OLDmSbUnULlkyKYnUQpEU930BCGKffXp5fwAzJAiABEkQIIDfp4qWp+dM4wzmYPrXp0+fY3r7BwNEREREROY4a7orICIiIiJyNVAwFhERERFBwVhEREREBFAwFhEREREBFIxFRERERAAFYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQEUDAWEREREQEUjEVEREREAAVjERERERFAwVhEREREBFAwFhEREREBFIxFRERERAAFYxERERERAJzproCIXLpcLsfgYArbtqmtrSlvD4KA7u4egiCgqqqScDhcLnshsWiUWDxGT0/vBcsaDPUNdQAM9A+QLxTKz9mWTSIZJxKJXMI7G833fY4cOUYmnaG9vY2KyuRl76+nu5eA4Lzlzv8eLZLJJOFI+Lz7SKXSZLPZEfs6W7FQpK+/H4C6ulos60yfRW9PH67nlj/Hs5U+5+7TPdi2RXNLM8lkYtT+e7p78Xyv/I5CIYdkMonj2OPW2fM8TnV20d3dS3NLI/X1o+udz+cZGBgsPzYYYrEoiTHq0N3dg+/74/68kpqaahzn4g9Npbqc+7dwIT3dPXi+TzgcpqqqcsRzZ//NnPu5DD2fZ3Bw6P3X19dhjBnVRs5VXV1FKBQCoFAo0N8/UH6u9PuLxeNYlpnwexCRyaNgLDKDvbltJz9/4GFq62r4s//rj8vbc7k83/z6v5DL5fn873yGlSuv4c1tO/j5A7+44D433LieO++6jf/vb//pgmWNMfz3v/p/AHj4oUfYuWPXqDLNLU289/33sGTJImx7/CB2Pq7r8sPv/5S9e/YChmg0yhd/97PMn992SfuDoZD79X/8Z4pF97zlzn6P//nzX7LrrT2jysxra+W977uHRYsXjApPAD/50f0cPHAIgP/jT3+f5uamEc8fPnyU7/zr9wH4+G99iBtuvB4YCqc/+N5P6Ojo5Itf+izLVywrv2ZwMMVjjzzO66+9SRCcCfdr117L+z7w7hEh79v/+7sjAljJqtUruOc976SpqbG8LQgCTp3q4nvf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)
图 9-5 HTTP 与传输层协议
Go 语言标准库通过 net/http 包提供 HTTP 的客户端和服务端实现,在分析内部的实现原理之前,我们先来了解一下 HTTP 协议相关的一些设计以及标准库内部的层级结构和模块之间的关系。
请求和响应
HTTP 协议中最常见的概念是 HTTP 请求与响应,我们可以将它们理解成客户端和服务端之间传递的消息,客户端向服务端发送 HTTP 请求,服务端收到 HTTP 请求后会做出计算后以 HTTP 响应的形式发送给客户端。
![](data:image/png;base64,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)
图 9-6 HTTP 请求与响应
与其他的二进制协议不同,作为文本传输协议,HTTP 协议的协议头都是文本数据,HTTP 请求头的首行会包含请求的方法、路径和协议版本,接下来是多个 HTTP 协议头以及携带的负载。
GET / HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: draveness.me
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Content-Length: <length>
Connection: Keep-Alive
<html>
...
</html>
HTTP 响应也有着比较类似的结构,其中也包含响应的协议版本、状态码、响应头以及负载,在这里就不展开介绍了。
消息边界
HTTP 协议目前主要还是跑在 TCP 协议上的,TCP 协议是面向连接的、可靠的、基于字节流的传输层通信协议2,应用层交给 TCP 协议的数据并不会以消息为单位向目的主机传输,这些数据在某些情况下会被组合成一个数据段发送给目标的主机3。因为 TCP 协议是基于字节流的,所以基于 TCP 协议的应用层协议都需要自己划分消息的边界。
![](data:image/png;base64,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)
图 9-7 实现消息边界的方法
在应用层协议中,最常见的两种解决方案是基于长度或者基于终结符(Delimiter)。HTTP 协议其实同时实现了上述两种方案,在多数情况下 HTTP 协议都会在协议头中加入 Content-Length 表示负载的长度,消息的接收者解析到该协议头之后就可以确定当前 HTTP 请求/响应结束的位置,分离不同的 HTTP 消息,下面就是一个使用 Content-Length 划分消息边界的例子:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 138
...
Connection: close
<html>
<head>
<title>An Example Page</title>
</head>
<body>
<p>Hello World, this is a very simple HTML document.</p>
</body>
</html>
不过 HTTP 协议除了使用基于长度的方式实现边界,也会使用基于终结符的策略,当 HTTP 使用块传输(Chunked Transfer)机制时,HTTP 头中就不再包含 Content-Length 了,它会使用负载大小为 0 的 HTTP 消息作为终结符表示消息的边界。
层级结构
Go 语言的 net/http 中同时包好了 HTTP 客户端和服务端的实现,为了支持更好的扩展性,它引入了 net/http.RoundTripper 和 net/http.Handler 两个接口。net/http.RoundTripper 是用来表示执行 HTTP 请求的接口,调用方将请求作为参数可以获取请求对应的响应,而 net/http.Handler 主要用于 HTTP 服务器响应客户端的请求:
type RoundTripper interface {
RoundTrip(*Request) (*Response, error)
}
HTTP 请求的接收方可以实现 net/http.Handler 接口,其中实现了处理 HTTP 请求的逻辑,处理的过程中会调用 net/http.ResponseWriter 接口的方法构造 HTTP 响应,它提供的三个接口 Header、Write 和 WriteHeader 分别会获取 HTTP 响应、将数据写入负载以及写入响应头:
type Handler interface {
ServeHTTP(ResponseWriter, * Request)
}
type ResponseWriter interface {
Header() Header
Write([] byte)(int, error)
WriteHeader(statusCode int)
}
客户端和服务端面对的都是双向的 HTTP 请求与响应,客户端构建请求并等待响应,服务端处理请求并返回响应。HTTP 请求和响应在标准库中不止有一种实现,它们都包含了层级结构,标准库中的 net/http.RoundTripper 包含如下所示的层级结构:
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApoAAAC1CAYAAAD/aV81AAAgAElEQVR4nOzdZ3Bc553n++8JnbvRjZzBnIMoiaJIUaRyTpajZMuWxvbOeLwztqd2t2bq3tp7t+7W7k1zd2Y9s16HkS2NLUdZsmQlK1OBIqlAScyZAEHk1DmcdF90o4kmABIMIEDi/6lCSex++vRzDg66f+dJRxmMxh2EEEIIIYQ4z9SproAQQgghhLg0SdAUQgghhBCTQoKmEEIIIYSYFBI0hRBCCCHEpJCgKYQQQgghJoUETSGEEEIIMSkkaAohhBBCiEkhQVMIIYQQQkwKCZpCCCGEEGJSSNAUQgghhBCTQoKmEEIIIYSYFBI0hRBCCCHEpJCgKYQQQgghJoUETSGEEEIIMSkkaAohhBBCiEmhT3UFhBBTJxaN0dHRhaoqNLc04/N5xyznOA5dXd309vRRU1NNTU01qjb6OjWXzTE4OISma1RVVU64Hn19/VimhcvtoqKifNTz6XSGWDSG7tKprKwofW1vP7ZjU1VViaqOrlM8FqejowuA5pYm/H7fhOs1lt6eXmzbKf7b5XIRKgvicrnGfY1t2/R099Ld3Ut1TSX19XUoilJSJpPOEI3G8Hg8RMrDJc/19w9gmRaVVRVomoZtO/T39WPbNlXVlWiaNmJ/E6RSKYKhIIGAH4ChoSjZTBYAVVOJRMLj1ndwYIhcLnfa41BdU4WqqiSTKRLxRPFxVVUIBAP4/f4xj0Nfbz+O44x6Lv9alYrKCrTCuTU4MEguZxSf13SNUCiEx+Me9dpUMkV8RD0URSEQ8OMP+Ecda4BUKk08Fh93/wLBAMFgYMyyiqoQDATw+f2MsWkhxAgSNIWYgQb6B3n2mRfYv+9A8TFVVbhm/VpuvvUG3O4TX+Qdxzv5+eO/JhqNFh+rq6/lgQc/T01NNYz4oj3a2sZjj/6Ciopy/v3ffndCdUkmkvzD3/8zjuMQiYT5D3/3vVHBYPfOPfz+yWfQdZ1/9x/+mnAkH8Qcx+Gxn/6CZDLFv//b7xaDFcDg4BDPPfsie3bvK9nHNVev5tbbb8LrHTtUn86P/udPSaXSJY8pisK8+XO56ebrmDW7peS53t4+fvPL39PR0Vl8LBQK8NVHvkxTU2PxsZ079/DUk8+waNECHv76V0q28cuf/4be3n6++zffprKqgmw2w49/+FOSyRTrr13LXffcXiz75htv8d7mbdx+xy1svH49AM89+yK7d+0tqW9VVSVrrr6SK6+6vORYPPm7P3Dk8NFTHgNFUfi7//XfEQoF2freNl595c1RZYKhIDfeuJHVa65A1/NfNalUmn/+/o8wTXPM7fr8Pr7zvW8RDodxHIcnf/fMmHVpaKjnxpuvY9HiBcWQ/cEH23nphVdGlfX7fazfuI6rr76q5CLj04938OwzL4y7jxs2rueOu24B4MMPPuLF50dvOxAMcP0NG7h67eriPgohSknXuRAzTDwW5wf//GP27zuApmksXDSfJUsXoWk627Z+SDx2olVoaHCIn/zoZ0SjUUKhEJetWoHP76Ors5t/+fFjJeHzbO3bewDHcQgGgwwNRU8ZckzT5Knf//G020zEE/zgn37Mnt37UFWV+QvmsXTZYnTdxYcfbGewf/Cc6z17zixWrlrOgoXz8Xq9HDxwiEf/5V85PKL+A/2D/PiHP6OjoxO/38eqy1dQFg4Rjyf5lx89TndXzznX473N2xgcmNj+VFZVsHDRfAIBP729fbzw/Mv80z/+kFgsVixTXV1FU1Nj8WdYRUX5iMcbiq2OwyKRMCtXrWDZ8iXU1FSTiCf447Mv8vTvnyu2YGqaSmNTQ8m2NU2joaGepqZGGhvq0bTRga25pZGVq1aweOlCgqEgHR2d/PIXv2Xnzj2jyrq9HlauWsHylctoaKwnlUrzykuv8/STz455THw+b8n+Dv9EystGlQ2VhVi5ajnLViyhrq6GZCLJC8/9id/86ils257Ab0CImUcuwYSYQUzT5De/fopUKk19fR1f+dqXil3Vg4NDdBzvpKIy/2/btnnujy+RzeZobGzgkW88RCDgxzAMfvboLzh6pJXXX32L+z9/zznV6eDBw7hcLm69/UaeevJZ3nzjHebOmzNmWZfLRVtrG329/VRVj901b1kWT/3+jySTKaqqq/jqww9QXV0FQHQoSmvrMeoa6s6pzgDXbljH0mWLAchms/z6l0+yb+8BPtj2EXPnzgbgvc1bSSaSzJrdwiN/9hU8Xg+pZIrHH/slx9raeeXlN/jyQ18Ys8t/InRdxzRNdu7YzYbr1p+2/JKli7nzrltxHIfDh47w7DMv0tvTyztvbeHOu28F4DOfvbvkNf/L3/4nAG68+TquuHLVuNtuaWnigQc/B+RbmvfvO8DPH/81hw4dJpVKEwj48fl8/MVffr1k2/6An6//m6+dckjD1WuvKr63bdu8/tomXn91E29vepfLLlteUjYcChbrAXDkSCs/+eHP2LVrDz09fdTUVJWUnz1nFl99+MFx33uk+vo6Hnjw88V9PHjgMI8/9gRHDh8hHk8QDo8Op0LMdNKiKcQM0tvbT1vrMTRN44sPfq5kPGR5eYRly5cUu62TiSStR4+hKAqf+ew9xW5pl8vF2nVXAfD++x8SjcZGv9EEOY7D0SNtBAJ+li1fgt/v41jbsZKxdiPNnt1CNpvjww+2j7vNaDTGoYOHUVWVB7/yhWLIBAhHwqy8bPmYY/bOhcfjYfVVVxTf33EcMukM776zBcgHJY/XA4A/4OeLD3wWVVVpPdpaHDt5NqqrK3F73Lz77tZxu6PHMrKrH+CdtzczNDh01vUYa/uLFi8kEAiQzWQmNOZzolRVZeHC+QB0dnRhWdYpy8+e3VIM8u3Hjp+3eiiKwoKF8wgFQ+RyBpl05rxtW4hLiQRNIWaQoYEhTNOkvqGe2trqU5bNGQbZXJZgKEBjU33Jc3MKLXbAOQWUo0eOMjQ0RFV1FV6vl9lzZ5PLGfT29I1Zvr6hjorKcja/u5WhobG77YcGoxiGQW1dDfX1tWddtzM1PAYyP75Vob9/oPhcS0tTSdmKinLKykKk05nTBqVTcRyHu+65jVg0xttvbT7j14/8PXZ3n3s3/kj9fQMkk0k0XS+ZrHQ+JJMpIN+Vraqn3nY6nSl2a0ci4VHP27ZNLpcr+Zno72Swf5BEIoGmaegu6SAUYizylyHEDNLRmZ+QEomc6OLr6enl8KET4wpDZUGWLVtCKpXGNEz8FaO7NAMBP6qqYts2Q9Eos86iLo4Db77xLgCrLl+BoijMmTOL3Tv3sHvXHubOmz3qNaZlctfdt/HEz3/D5ne3csedt4xqnWxvz7dahUKh4mMD/YPs33+w+O9gKMDy5UvPotYntLa2YVkWuZxB69E2tn/0CaqqcsWVl6Eo+dnbwwLB0TOwvV4vQ0NR+vsHCIaCZ1UHwzC58soreOO1t9n+4Sdcs37tGXXDBwJ+NF3HMk16e/tZtPisqgHAUDTGjk935c+JwSHefWcLtm3T0tJUMknrbCQSSQb6BzBNi/7+AV4rTD5avmLpqFnflmUx0D+A4zgkEkk+fD/f+h0pj9DU3Hjyptm39wD/6T/+15LH1q2/mnvuvWN0PeLx4j7GojE2v7sVy7JomdUk3eZCjEOCphAzSDab78IcGUbaWo/x7B+eL/571uwWli1bkk+CwFjrt6iqWpzgMc5KNaeVTCRoa21D0zSWr1iKbds0NORbTrd/9Cl33XP7qBCZyxrMnTeHiooKdu7Yze133Dxqtu9Y+9jR0Vmyj00tTeccNN/eVNqCqOs6d997OytWLgPA4cTkEIUxuuoLD53LJBLDNFEUWLZsMe++s4WjR1tPuczSyVRVPfELPNtfZEFb6zHaWo+VPDZ33hy++vCD5zxU4aUXXimZUa4oCmXhMm686bpRZQcGhvj7/+f7JY+5XC4+94X7cLtHHxtN00YtlzRWOYCOji5+9cTvSh6bNbuFb/ybh896nK0QlzoJmkLMII2N+SCXSCSLj81fMI+vPfIgrUePsenNd4qP+wN+dF0fc+xZMpkqBs3IWbbk9PT2YRgmqqry6I8fB8AsdFmm02n27T3A4iULS15j2zYej4crVq/i5Zde44P3PxrVZdlcaLVKpVLFx2bNbuZrjzxIe3sHr7+66azqe7JrN6yjoaGe1157k/6+AebOm8NVa64sPl8+YvxrMpXCfVKYyWZzqKpKZWG90eFZ3A6jA1/xkZPymlMIqes3rGPrlg949g8vcMUVl014H5LJVLGbuPqkSTJnqqWliXXXXE1b2zHe27wNVVX53OfvPS/jYRsa6igLh3EV1lFtbmli3vw5JctwDXO73cydNwdFUYhEyqirr2XBgnlEyiNjbnvhovkTnwzUUMfGjes5fryDd95+r7CP90nIFOIUJGgKMYNUV+cX2e443kkqmcIf8BOJhIlEwphm6bg0t8uFx+MmFovT29NXEkRaW9uAfMvSeF/gp7Nn1z5s2yYYDJDJnpgsEioLEY/F2blj96igOWz9tWvZ8t77vPTCq1RVlS7gXl1dha5rdHf1kEwmCQQChEIhFi9ZBMr5CwSz58xi6bLFBEMBHv/ZExw+dISuzm7qCzPay8vLUTUV27I53t5B+YjjFI/FiUVj+HxeXIUW2eHAmRljclAmncHlco27VmMkEmbd+qt5e9O7dHZ2TXgfjh5pBfKterW1NRN+3Xh1uOzyFSxbsZRDB4/Q09PLRx9+wk23XH9O2wW45tq1p5zxPlI4HOJrj0wsOJ6pUCjEZZevYPnKpRw8cJiurm7e3/Yhd9x166S8nxCXArkME2IGqaqupKwsRCaT4Xe/ffqUkx4CwSDVNdU4jsPvf/dMSRfvhx98DMCyFUvHnGBxOo7jsP2j/DY+98XP8J3vfav48/Cf5Rcrb28/Pm63ssvlYv36tWQyGbpOWouyLFxGZWUl2WyWX/78t2c0G/tszF8wj6VLF2OaJq+/dqK1NBDwc/nl+dbF7R99UnzccRx+++unsCyL2rra4mz0YKEFubOzC8M4UeeOjk6GhqK43S5cp5hwsvqqy3F73Bw4cGhC9c5kMrz6yhv516654qwvGE6m6xq335UfO7vpzXdIJpOnf9FFRtM07v3Mnaiqynubt5FIjL1KghBCWjSFmFHcbjdfeOCzPPboz9m/7yCP/vhxmpob0V0u9u3dX1JWVRXuvud2fvQ/H+XYsXYe/9kTNDY20NnZxf59B/F4Pdw8TmtVMpniqd+PXiC7traG9deuZf++g6RSaTRNpbm5sWRWcmVlBaGyEP19A0SjsZKWwJGWrVjCiy+8jGmaJa93uXTu/9w9PPqTf+XIkVb+5UeP0dzSlA9h+w6Oua1zdc2GdezYsZvdu/aya+celi1fAsCGjevYsWMXe3bv42eP/pympkba249z+PBRNF3jlltvKHa7loXLaGxqpPVoK9//hx+wfOVSjJzBx9t35Pd3+RJ8vvHXmqysrGDu3Nns3bN/3DJHDh/luWdfJBqNcfRIK8lkinC4jA0brzmPRwPmzp1NdU0VPd29/P53z/CVr34JTdPIZrO89MIrWCMuIDLpDM//8SU0XcPtdnPTzdedcj/Pt86OrjHP1Yrycq6/ccO4r2tsaqSxsZ5jx47z6yee5JFvPCR3BxJiDPJXIcQMM2fOLL7ytQd49unnaWtr5+jRfDe4y6XT1NzIZ0cswN7QWM8DX/4Cf3jqjxw8cJgD+w/lJ2KUhbjvs3fnb0E5hmw2ywfbPhr1+IJF81l/7Vp27tgFwJIli0fdCnJ4HF48FuftTZu59zN3jvkeFRXlrF23hi3vbRv1XMusZh7++ld4+slnOX68k7a2diA/YaehoZ77T1qU/FzNmtXMZauW88nHO3nz9bdZsnQRqqpSU1vDQ1/9Ek89+WzJ8QsGA9z/2XtLblep6zqf+8J9/OaXv6Ojo4tNb+THy6qqyqLFC7ntjptPOd5RVVXuue9ODh44PG4r7vH2Do63d+B2u/H6vKy8bDmf+8J9ZzSBaCLcbjcPfPnz/OCffsKhg/khBY1NDRiGyYcffFxSP8Mwii2+Pr+PDRvXXdCgOTQUHfNcbW5uPGXQdLl0PvfF+/gf3/8xra3HONbWXrJclBAiTxmMxs9tqqEQ4qKUyWRIJlN0HO/E5XJRW1dDIBAYc8ZtMpkkFo3T2dFFY1MjobLgmHdyMQyDWCw+7nu6XC7KykLEYnEMw8Dv9+Pzjb7neDyeIJfLoWsa4UiYbDZLIpHE4/EQDAaK5UzTJBqNFSZ+RFDV0iCWzWZJJpJ0dHShaRp19bUEAv4xJ5FM1ODAILbjEAoFS7YzvO+KolBeHikJhelUmlg8zrFjx6mvryMcLivZj5FyuRyxWJxjx9pxu9zF8pp+otXWcZz8+qWF9xppaDCKZVslx3b4eA7TdR2Xy4XX6zntRJbh9UCDwQAej2fU8+lUmlQ6jcftHrVM09DgEJZtF+syvPTReF86+d9juFinWDSGYZrjvndJPdIZUqkUmqZNaDjH8Pk/Hl3Xi0sWDW/b7XIRKguVlBsaimJZFn6fD98p7m4kxEwlQVMIIYQQQkwKmQwkhBBCCCEmhQRNIYQQQggxKSRoCiGEEEKISSFBUwghhBBCTAoJmkIIIYQQYlLIOppCCHGeOI5DV28fqqIQCgbxj7F0kxBCzCTSoimEEOeJZVl8unc/A9EYb7y3ddJvfymEENOdtGgKIcR55NJ1Fs+bQyqd5kh7Bx6XzrHObgI+HzVVFVSVl7Pn4CFUVSWbzXH5iqV8uGMXay5bwZ6Dhwn4vFSWl7Nz3348Hg+27XD5ssW8+ObbtDTU0T8YY90VK+no6aW7rx+320VlOEJ9bTWbP/yY2soKHBwWzZ3D/iOtKIBhmiycM+ucFqoXQoizIS2aQggxCVwuHduysBwbr8fDqmWLaaitQdM1yiMRHAf6h6LYto2qqgxGoxzv6qa+pprDx47hOKBpKp09vcWW0UVz51JdWU5Xbz+H29rRNQ237qJ/aAhVUVCBeCpJOFQGioJL0+gdGMDn86Io8nEvhLjw5JNHCCHOI9u26ezpo6O7l+aGOgD83hO3T+wbGKTteCezmxryt8x0oLm+jo9376OhtgaXy0VFOIKmq8xraebqVSvQtBO3n1QVBXDwe7143B7mzWpm4ZzZWLbNkgXzWLZgPrsPHCSVShMKBli9cjlD0ThH249f6EMhhBASNIUQ4nxRVZXaqkqGojHWXLYCv89HJBSicsT9yMvDZZQF/XT29LJgzmxUVaW6ooLqinJmNzcC0FBbTWU4wv4jR8kaORRFYW5LM6qqUlEeoSwU5IoVS9E0lX2HjmAYBoqiMBiNsf9IK3NbmvD7vBimyd5DR/B5PcxqapiqwyKEmMHkXudCCCGEEGJSSIumEEIIIYSYFBI0hRBCCCHEpJCgKYQQQgghJoUETSGEEEIIMSkkaAohhBBCiEkhQVMIIYQQQkwKCZpCCCGEEGJSSNAUQgghhBCTQoKmEEIIIYSYFBI0hRBCCCHEpJCgKYQQQgghJoU+1RUQQojTcRyn+N/h/xeXFkVRUBSl+P9CiEuDBE0hxLQ1HCxN0yQ6FKO3t490Oo1t2xI4LxGKoqCqKj6fj+rqKsKRMnRdLwmeQoiLlwRNIcS05DgOlmWRy+V4792tvPXmZkzTlIB5iVIUBV3X2Xj9NaxbfzVutxtN0yRsCnGRUwajcfnUFkJMK8MhM5NO88zTz7Nr596prpK4gJYtX8x999+F1+eTsCnERU4mAwkhph3btslms7z91mYJmTPQrp17efutzWSzWWzbnurqCCHOgQRNIcS0Mjwms7enl/fefX+qqyOmyHvvvk9vT68MlxDiIidBUwgxrTiOg2EYdHV2Y1nWVFdHTBHLsujq7MYwDAmaQlzEJGgKIaaVfNDMEYvHJWDMYI7jEIvHMYycnAdCXMQkaAohppV817mFYRhTXRUxxQzDwDQtCZpCXMQkaAohppXhtTMdSyaBzHSOZcsi/UJc5CRoCiGmHcdxcJBwMdM5SMgU4mInQVMIIYQQQkwKCZpCCCGEEGJSSNAUQgghhBCTQoKmEEIIIYSYFBI0hRBCCCHEpJCgKYQQQgghJoUETSGEuIQoikJ5RQRVVaa6KkIIIUFTCHHxc7l0XC5X8UfVpt9HWyDg5ytffYCr164GQNO1kjqf/KOqZ7cP19+4kf/wd99jw3Xrz2f1hRDirOhTXQEhhDhX3/jzh/F6PQA4DuRyOfbtO8Drr2ya4pqdoLtcLFm2kEQiAcDtd97CggVzxy3/yp9eZ9fOvWf8Ph63CwCfz3d2FRVCiPNIgqYQ4qJXXVOFz+fjg20foWoa5eURbrr5emprqvntr5/Cmoa3s4wORunu6gGgtq6GmtoaDu4/RDqdBiCdzpzVdl95+Q127dxLR0fneaurEEKcLQmaQohLxlNPPlv8/6/92VdYvHQxoVCIoaEokB+/OGtOM/MXzKf92HH27dlfcovDxqYGvB43R48ew7IsAJpbmvB43Bw8cBgAf8BPU1MDba3HsCyb5SuW4g/4+PD97WQy2ZL6RCJhVl2xkp6eXo63d5a81ztvv1f8/5tuvYEba6p56cVX6Tg+OiDOnTebaDRGf98APr+PlZctx+Nx8f7Wj0inM9TUVBEpj5S8pixcxuDAYPHfJ+rdjsfr4YorV9Ld1cue3ftK6rVg4Ty6u3rIGQarVq3AMEx27thNNlu6b4qi0DKrmfkL5tLd1cP+fQfJ5XJnVG8hxKVPgqYQ4pJkGgaKAror/zHn8/n4s28+RGNTA4lEkhtu3MDQ4BC//dVTtLYeA+CW226kvqGO//7//YBUKgXAXffcRl1dLf/pP/5XABobG3j46w+x49OdLFg4D6/Xi6IoXHfDBn70g0fp7xsA4Mabr+P6GzegqiqGYZCIJ1GUs5ug88UHPsuB/YdIpdKsW78GXc/v055d+0mnM1y1djXrr11b8poXn3+ZtzdtLv57uN6dHZ3U1FZjWTYej5uOji7+9adPEIvFgXxA7+3ppbyiHMdx8Ho93HTr9fz6F7+jra0dgMqqCh748udpbGpgaHCIUFmIeDzBE//6G463d0y43kKIS58ETSHEJaOhsR5VVWlqamDJskUMDgwSi8bRNI2vPvIg9Q11/PZXT/HJxztobm7km996hM9/6X6+/w//E8Mwzui9Gpsa+Pnjv6bzeBd33HUra9ZeScusZvr7BvAH/GzYeA1Dg1F+8sOfkUym2HjdNdx6x81nvW/LVywlHk/w9JN/ZOeO3QSDAQYHhwB4/tmXeP7ZlwBYtHghD3/9y+NuxzRN/v7/+u/EYnHuvOc2rt2wjsVLFrFt6wfFMoFAgJ/88Kd0HO/islUr+PyXPsP6jeto+8XvUBSFez9zFw2N9fzi8V+ze9dewpEwf/6tP+PLX/0i//j3/4xhmBOqtxDi0jf9pmYKIcRZ+ta//SZ/8e2vc+/9d3Ho4BH+x/d/TC6XoywcoqmpgUMHj/DJxzsAOHbsONu2fEBlVQXNs5rO+L3ee3cbRw+3ks1m2b0rP2mnvNB9vXLlMjxeD+++s4V4PIFt22zfvgPbPvuxorZt89hPn2D7R59gGMZZh7VPPt5ZbL38ZPunQL6Le6Tunl46jncBsHfvfqJDUaqqKgGIlIdZsHAeXV3dqKrCshWLaWqup6Ojk1AoSCgUmpR6CyEuTtKiKYS4ZPz8sV/SMquZG2++jiOHj5LN5scMej0eFFUhmUyWlB8YyIeeSLjsjN/LGREabTs/nlMtdI3X1FYDlIyRPFexWJxoNHruGxoxHnO45dFTmLE/VhnHdrAsu9jtHQ6HASgrC3HzbTeWvKy3tw9OGh1w3uothLgoSdAUQlwyDuw/RHt7B5dfeRlXr72Kze9sxTAMkskUtm1TWVmJoig4jpOfGDSrGYDenj4AbMtC07TiYueqqqJpGs647zi2rsJs8pqaavbvOwiArmmMSmFnwMHhjCsylhHjRCORfGgcnv1+osiJMm63C6/PS19v/hj19vRh2w6dHT089ujPT9tKe97qLYS4KEnXuRDikpJOpXn7zXeJlIf57OfvBSAeT/Dx9k9pbmnk3s/cSVlZiGvWX82KlUs5dPAwxwszveOxOD6fl7vuvo35C+Zx72fupK6+9ozr8Mn2T8mkM1y7cR1z586mZVYzX/7qF6fF3XpWr7mCltktNDY1cPudt2BZFnt2l67XWVdfy9LlS6iureYLD9xPKBRkz+59ACSTSba+t41582dzy+034va4cblcrLpiJbPnzJqKXRJCTGPSoimEuORs2/ohV6xexfKVS3n37fdob+/g2aefR1VUrrzqcq5edxW2bXPw4GGeefr5Yqvcli3vM2/hPC67YiXLVi7j0MHDbNm8jdVrrjyj989mc7zyyhvccusNfPNbj5DL5ti5YzfhQgviVDINg69/4yHcHjepVJrXXnmTY23HS8pkMxnuu/8uQqEglmWxbcsHbNn8fvH5117dhMvlYu26q7ju+mtxHEgkEmzZvI2jR1ov9C4JIaYxZTAal04NIcS0YRgGAwMDbNvyPu+9+8HpX3CGNE2joaGO3t6+UeteQr67vK6+loGBQTLnuASPqqo0NNTT3d1zxrPaz7cFC+fzyDce4tk/PMcH27ZTV1dDV1f3qMXs//P/+b9x8MAhHv/pE9TW1tDf349pWmNuU1EUamqryeVyDA6c/0k+69avZs3aq6ioqMDlcp337QshJp+0aAohZhTLsjh27Pi4z9u2Peai6WfDtm3a28d/r6mgKiqWZRWHC4xF0zQAurt7xi0D4DjOqPGdQggxkozRFEKIGcC2bXK57Glvx5nLZkvWwRRCiHMhLZpCCDEDHD50hP/8v//fJbebHMt/+T/+3wtUIyHETCBBUwghZgDHcU4bMoFzWlReCCFOJl3nQgghhBBiUkjQFEIIIYQQk0KCphBCCCGEmLairnsAACAASURBVBQSNIUQQgghxKSQoCmEEEIIISaFBE0hxLSkKFN/X3AxteQcEOLiJ0FTCDHtKIpSvDuNmLk0TZOwKcRFToKmEGJaURQFVVUJhgISMmYwRVEIhgKoqirngRAXMQmaQohpRVEUdF2nvCJCZVX5VFdHTJHKqnLKKyLoui5BU4iLmARNIcS0oigKLpeLYDDE5Vcux+fzTnWVxAXm83m5/MrlBIMhXC6XBE0hLmISNIUQ04qiKLjdbkKhINU11axYtZhwJDjV1RIXSDgSZMWqxVTXVBMKBXG73RI0hbiIyb3OhRDTyvBEIL8/QFVVNZZl4fN76WjvpK93kFw2h22f/p7d05FDvt4Kpw9Ok1V2OlJVBbfHTVV1OQ1N9dTV1VFVVY3fH5AJQUJc5CRoCiGmneFWzbKyMlRFwef1EYlESCaSZHNZLMua6iqelc6OLnSXTnV11WnLdnf3AFBbW3Pasr29fZiGSX1D3TnXcSpomobH7SEQDFAeKScSiRAMhaQ1U4hLgARNIcS0Mzzz3OPx5EOI10tZOEw2m8EwTGzbnuoqnjHHttm9Yz/BYICF6xeduqzjcHDfUQCuvXbhacNW25HjJBJJNm7cgKJefCOiVFXF5dLxeLz4fD68Xi+6rsuMcyEuARI0hRDT0nAXuqqq6LqOz+fDsiwcxyn+XEySiSTJRAYjZ1FfX3/KAJXLGcSiCQCqq2twu13jlnUch8GBGLmcQSRSTiAYOO91n0yKohR/NE0r/s4lYApxaZCgKYSY1kYGkIstXI6045NdGIaBYRgcOXSUFZctH7fs3t3byWSyABw+eIQrr7r8FNvdSTKZypc9dJS116w5vxW/gCRcCnHpufj6WIQQM9bI1q+L6cfIGbz+6lvF/XjhuZcxTWvMsqZh8vJLrxfLvvzS65iGOXZZ0+KF514uln391bcwcsaU7+/Z/gghLj0SNIUQYpId2H+QZDJZ/Hc8Hud4+/Exyx45cpREIlH8dyKR4MiRo2OWPd5+nHg8Xvx3MpnkwP6D56nWQghx7iRoCiHEJNvx6e6SfzvO6MeG7Rzj8bEeG97uyaMJxtuuEEJMBQmaQggxidKpNHv37h/1+PYPPymOwyyWTWfGDIo7Pt1NJp0peSyTybL9w09Gld27dz/pVPocay2EEOeHBE0hhJhEr7+6iVw2RyBwYjZ4ZVU5mUyGLZu3lZR9e9O7ZLNZgqETZSsqyslms7y16d2Ssls2byOTyZTcDz4QCJDL5nj91U2TtDdCCHFmJGgKIcQkMU2TisoKvvM3f8ncubOKj99w43V8+zt/TllZqLgmqGVZRCIR/uq732Lx4hPrbK67dg1/9d1vEYlEigvV27ZNWVmIb3/nz7nhxuuKZefOncV3/uYvqaiswDTNC7SXQggxPlneSAghJomu66xbn19uSNM1QoVgGQwGaGpqoKmpoVhW0zTWrL0SAK/XQyiUv7+7y+WiobGOhsYTd/1RVZUrVq8CIJVIEggGUFUVTdeoq6+lrr72Qu2iEEKckjIYjV+8C9MJIcRFIpvNYhbuauTz+9D18a/zs5kshmkA4PF4cLnGX7DdNE3SqXR+YXuXjsfjOe91F0KIsyVBUwghJlFnRxfpdJq58+ZckPc7fOgIPp/vor3vuRDi0iJd50JMIdO0MAt3izFMk4qK/MQO27ZJpdJA6XWggoI/4C8ubp1Kpca877fP50PTNAAymcyY4/U8bg+uwq0Nc7kcuVxuVBmX7sLj9RTqapLJZEaV0VQNn98n9S7UO53OYFkm/X0DbH3vfT79ZCcVlRV879/9W9QJ3ofcNC1sOz8ec/iuSBNh2zZ/eOo5BvoHWHnZcq5edxWVVRVomo7P5wXyY0HT6dGz0lVVxe/3A/nbWqaSKRxObodQ8Pt9xf1Ip9JYhXqONHyvcihtnR3J7XbjdrsBMHIG2Vx2VBld1/F6pd7D9R4YGMSl67hcLnSXC12f2HkhxFSSoCnEFDBNk/e3fsiHH3xMNBojlUyxYOF8HvnGVwDo6enln/7hh6Nuuejz+/jO975FOBLGtm1+8sPH6O7qGbX9R77xEAsXzQfg6Sf/yI5Pd40qc+fdt3HtxnUAvL1pM6+98uaoMqvXXMFnP38vAHt27+NXv/jdqDKzZrfwF9/+utS7UO/f/vJJ9u0rXTS9r7efP73wKnfcfeuo147l9VffZMcn+X2/7oYNrF4z/i0oR3rphVfo6+0H4OPtO/h4+w4AFi2az8PfeAiAQweP8Nijvxj12tq6Gv76e99CVVVi0Rjf/8cfjlomSVEU/vpvvkVdXX4M6L8+9itaj7aN2taDD32BFSuXAfD8c3/ig20fjSpz0y3Xc9Mt1wOwdcsHvPDcn0aVWbFyGQ8+9AWpd6Hezz79Agf2H8Qf8BMOl3Hl6lVcdfWVpxyGIcRUk7NTiAvseHsHf3zmBdpa20seT6VSU1QjcX6V3kpRVVWamhtontWE4zgTutViMpmkv38AyLeQToTjOLTMaqZl1jHaj3Wc1PIqt3e8FKRSKRzHIZlIkkwk6TjeyScf7+Ce++6kccTEMiGmEwmaQlxgnR1do0ImIK0Sl4pCpqusrmD27NncdMtGwuHwGd3Lu7TsxIbRK4rC8hVLWbZ8CdFolNdeeYujR4/S3zsgOfMSMdZnRFtrO50dXRI0xbQlk4GEuMAcx+HpJ5/lww8+5sabr2PlquVUVJRPeByeuPT94ak/sm3LhwDcftetbLzumimukZguLMtiYGCQTz/eyeuvbuLK1au4//P3ntGFjBAXkjShCHGBKYrCrbffxIbr1lNdUzXV1RHTkEQGMR5N06iuruKmW65n5WXL8fm8EjLFtCZBU4gpEAwFCRYW5BZitDPvOhczj1yoiouBdJ0LcYE8+/TzHC3MdL39zluKs5SFOFl//wDxWBzI3+u8LFw2xTUS09X+fQd56YVXAJg9u4V7779rimskRClp0RTiAhkYHKKrsxtgzHUdhRhWWVlBZWXFVFdDXAQymUzxc0UuSMR0NLHVg4UQQgghhDhD0qIphBDTzJbN77N3734AVq9exfLCIuJCCHGxkaAphBDTTHd3D/v3HgBg7txZU1wbIYQ4e9J1LoQQ08zI5WpOvi2mEEJcTKRFU4gL5PY7bi4uvF1bWzPFtRFCXArmzZvDN//iYQD8fv8U10aI0SRoCnGB1NXXTnUVxEVCVtEUExUIBpgbnDPV1RBiXNJ1LoQQ05kkTSHERUxaNMUFZ9s2juPgOA62bU91dS6Y11/dRMfxTgCu3biO2XMu3UkeqqqiKAqKoqCq5349O9POmSXLFlNVXQlAQ1M9uVxuims0+eScOTtHj7TyzlvvAdDQWM+NN183xTW6cM73OSMmh9wZSFwwtm1j2zY5w+BoOskeM8WgY2EBM6HZJh5PYOQMAILBIG6Pa4prNBkUdBSqFI1lbj+NHj8ulwtVVc/qi2D4nDEMg7ZMkt1GmgHHxARmwjkzMyjoQIWis9Tlo8UbOG/nzPFsil25FH2OhYnDpXjO5LIGiUQCAJfbRWhG3NpWQQPKFY0lup/ZvgDuczhnxOSSoCkuiOIHfzrBu9k4nbYx1VUSk0wFmlU313rLqPYF0HX9jL4EbNvGNE26UgneycY4bhuXYEwQIylAo+riWk8Zdf7gWZ8zvekk72RiHLNzXLptmWJYvepivSdEoy9YvEgR04cETTHphkPmQDLBU9lBkhIXZpRKVD7jqyDkz7dUjVy6ZzzDgSGWTPD7zCBRiQszShiVz3nLKQtMPGw6joNhGMRTSf6QHqBfzpkZJYDCZz3lVAQkbE438psQk862bdLpNH/KDEnInIH6sXkjPUQmk5nwWLnhc+altITMmSiKzUvpQdLp9BmdM5lMhjfSQxIyZ6AkDn/KDJ3ROSMuDAmaYlINt2a2pxP0KPLHP1O1Oyb96SSGYZx2AfLhc6Y7naRTzpkZq1Ox6S6cM6cLDsOtmf3pJO2OeYFqKKabHsWmPZ2Y0DkjLhwJmmJSOY6DkcvRk8tMdVXEFDKAoXQacwJBE8A0DPoyaWn/nsEcoC+TP2dOW9ZxMA2DoXQaGf09s/XkMhi5nNxRaxqRoCkmleM45AyDtCWtDDOZo0A6l8UwzYm1aJoGaVMiw0yXNg0Mc4ItmqZJOpfFOf0QYHEJS1smuQle0IoLQ4KmmFSO42BZFpYl3RgznWlaWJZ12i+A/DljY1nWBaqZmK6GPzsmds5YmKacMzPd8GeHBM3pQ4KmmFTDCyY7jgTNmW54Ae0Jl5UxVjOeU1gTc0JlL/GF2cXEOM6JhfrF9CBBUwgxLcnXhJBzQIiLnwRNIYQQQggxKSRoCiGEEEKISSFBUwghhBBCTAoJmkIIIYQQYlJI0BRCCCGEEJNCgqYQQgghhJgUEjSFEEIIIcSk0Ke6AkKcb6qiMN5d6GzHkbX5LnKVupsby6rZkhjgWC491dUZlwooyvj3Q7RkQelpwatqbAhVUqO70RSVuGXyYrSLzIjF328J17DQG+TVaA/7MgkAGlxe1ocqi2V2pmPsScfP6L1P9VnlOA6y/Ly4FEjQFJecR6paqNLdYz63LTnIm7G+C1yj6eH2cA1eVeMPg51TXZVz4lVV5nj87EzHTlkuoGo8VNXMy9EejmRTY5aZ7fZzW6SGH/ccPeMLEE1RmOPxs8JXRrXuYdAySsLvPeX1LPIGx3yt6Tj8t66DZ/iOl4a1wQqa3V6eHOiYFhd9awIRVvnDHM4kOW6kqHZ5yJ50h6GsbZOzbcwRFwcmDknbxKOoLPAGOW6c+UXPXeFalvhCYz7XbWR5vK/tjLd5KbivvJ6EZfJarHeqqyLOAwma4pLzcrQHt5ofFXJ/pJ4BM8emRD8AQ2ZuKqs2pcp1N+q47SeXHp+qEdZcuJTxRwhVuzyENddZbX+lL8wNZVXsTMdoSw2xOhDhixWNPNF/jC4jy5bEADsKYfjaYCURzcWfYt0YjoM9g1szq3Q3wbM85pNhtsdP1rF5ZqizJEiO9Ha8n/cSA5gjbqXbY2R5YaibCt3NgnEuKE5na3KQXZl8K+jNZdW4UHgx1gNA1p65921vdPtoG+fiUFx8JGiKS077iO5UB4eUbXE4kywp41ZUri+r4lAmSdQyuCIQoUp302NkebVwFV3r8rDEF6JSd+NWVPrNHJvjAyRsExWFm8PVdBtZ4pbJMl+IoKbTnksXvpDyX1jVLg9XBiKUay4sx2HQMtiRitJlZAG4qayaATOHX9VpdHsxHJvtqShHR3zIRjQXa4LlVOhusrbF/kySPelYsVstqOpcX1bFR6khcGClP0yF7uJYLs3b8X7WBSuo0t1U624c8q0FABnb4tVY70XbhetSVG4qq6Ha5SZlmbyd6GfQNPCqKhtDVUQKYWZNoLzYanQgk2B3Os5ib5D53iB1Lg+QPybDR+GVaC8p2+SGsiqiVr7Fqtntw3QcPklHOVQ4l3ako/SYWTpyaZzCtr9RPZv53iBdRpZuIwuF3/MVvjAhTedoJkXWKW0tuz1cQ6eRZX8mwZpAOXUuDyYOzw/lu2+Dms5yXxl1Lg8BVSNmmWxPRYvn+eWBMCFVZ3c6nj/XdDdDZo5N8X7ShbDiVzWuKmxbVRSGLIMDmURxX64JVqAoCnHLZL43gIbC/myCT1OxYij2jdiGQ/7v7KPkUMn+3Fdez550nB4jy5WBCNUuDzHL4OVoD/M9AeZ7g8zy+NFRisc8Z9u8Fusl51zYjuKbyqrxqxoVhb+LuyJ1ALwV62fQylGlu0u6xgG2JgbpMjJn9D4VupurApHC36/N4WySHekYluPQY2TpKZwj2WAFiqqN+qyC/HHdlhgEYKW/jCrdTWsuzTvx/AV0jcvDcl8Z5boLj6LSb+XYFh9k0DIAuDZUSca2GLIMlnjzn1VHsyneSwwU3yOiuVgbLKdcd2M5Dv1mjt3pOJ2F/V0diOBXNXqNHEt8QXRFpS2X4v3kUPEzpFx3sTpQTrXuIW1bhb+3WMkQgPvK63k73k9I01nqzX++7snE2Z6MsiFUSZmmE1Q1mty+4mfV8PksLk4SNMWMpCoK8zwB/KrGHI+fuG0xYORIO/kvZk1RuKmsBq+q0p5LE9Z0lvnKaHH7+FlvGygwx+NniS+EYdt0GRnKdRfNbh/HcxkOZ/NfFreHayjXXGxNDqKhsMgbIukxi0FztsfP5YEIvUaGLiPLgkIA+knvUYZMA1+h+xfyQaZcd3FHpJaQprOl8CXhVhUWeoOYjsNib5C4bTJkGiX7ohZ+LtZQOZaNoUqipoEDLPSFKNfd/GtfG6CgoaAXxkeO3OPh/1cVBU1RcBVavkvL5P81y+OnWvfQa2TpNDLM9waZ5w3waG8rA2YO03E4PuKixgYUIGmZZ7Qf87wBQpqLVf4wPlWlzzTwKBq5wu/qSn+Exb4Q7bk0MctktsfPXG+An/a2ErdMal1eFnuDrPCF6TazBFSNFn+YAdNgWzIfTm4pq2auN8D2VJSUZTHb42d1oJzDmSQO0Ozx0ez2E7MMWrMp6lxebi2rwbBtdqXjqCjcHq5hrifAvkwCFYVrghWU625eGOoq7suiwnl4bbACXc1fnGnkzzutcMwV8gdq+JhP1RmpF/4mTuYoo2vkU1Va3H52peNgTPw9PIrKFyoa0RTYnY5TpXu4JVxDznHYfZqhH8MU8sd1wMyxxBvCIn/BOrJV/JpgJZW6m7ZcirCms9xbRpnq4ncDxwFodvuo0j0Yjk2vmaVcc9EcquR4Lk1bLo1LUXmkqoVc4UJXBeZ5g2iKQlc0gwPUub0s9YaIWSYHMwka3F42hqoYsAz2pxP4VI0vVjSiKwp70wlqdA93RGpBgZ2pWMm+9BhZLvOHyToWQ5aZv1hRwKUo6GP0QDgzqCfmUiRBU8xocz0BnhzsoCOXxnROfJxZjsPTgx0YTn5clqYo3FJWw0p/vtVguKUgaZn8sr+dlJ3/8v5iRSNVursYNAOqjuE47E8nCmP4Bjn5u23AzPFEfzum47AjHeehyiZW+sp4K97PmkA5PlXjF/3H6MxlcCkKX6tqYaWvrBg0hy3xBfntwHG6jCzWiH0ZbvX4ZvUs0rbNMxf5GM1h2xKDbEsOoqLwQGUjTW4fXlUlbVu8GO0u/j7eTw6yvzCBY9judJzd6Tj3ltex2Bvi2cHOMQNP3DJ5or8dw7H5IBnlG9UtXOEPF1u9h6ko3B2pJW1b+TByhmZ7/GxLDPJeYoCcY6NwIoC9k+hnS3KgOG7wqkCE68uqKddcxAuh1q2o/GqwjW4jS1DT+XbNnPw2k4MogE/TsRyHg5kk7bk07ycH0RSlGI4BYpbB431tZGybCt3N16qamecNsisdZ5bbx3xvkA+Tg7xRGON8b3kdS31Btsbd9FsnhqQs9YXYFOtje2oIY0QY2lU45g9WNuFRtXGP+YXyp2i+i/rf1MzGHOPvos/MFR9rcftoqfSf8XvcUFZNUNX4aV8bg2aueK5eGQhPOGgOWxus4LmhLg5kEqO6+F8Y6sLCKQb6+yP1tHhK6+tTVR7vaSVmmVS7PPxZVQvzvUHacmk8iopbzU+E2puOM2gZbE0O4jD6QuCJ/mPELROfqvHXtXPZEKxkfzrBMl+IsObiuaEudqfjaIrCVyubua2shsOZJKkRQwHWBSt4arCDY7l0ycXvq7FePKrKd73zaM+leW7ERYy4eEnQFDNaay5VMhZo5IdqSNNZ5Q8zy+3DgmILmUfVoBA0s45d/ABNDH/pqyeuyN+J97MuVME3a2YzYOZozaX4JBmld8RYUctxih+2g2aOjGMTKnT7VuguUrbFkJl/P8Nx6DayLPYFUaGkS2pXOs7x3IluvUun7XJscTt/vG0c+swcTW5foTXk/HXB2jjFcXlDVo60bRHWR48vXB+qoNHl4/eDHWfVBRyzDN6K943ZyudSFK4KlDPXE0AvtAgq5GdLj9RfOKcSlknOsYvPO8B78X42hKp4sLKJhG3Slk2zOx0rmSRlO5Cz8++ctE1ytk2wsI1Gjw8F+DA5VKzbzlScRd4QjR4v/akT53O/meP9QkiZyRRgrsePosAXKhqKj3sVFfUsGug6cxn2puNjHtcyTeeKQIQmtw8At5Jv0fcoGlnnRMBLWPn/7y1cjPqU/O83YZv8KdrNmsCJz6qjuRQ7U7H8EJARhodjpG2LXjM/xEAhf7EEFM8py3E4lE1S4/IQ0V2kcifq0ZZLlwwPEpc2CZpiRjPG6Ur2qxqfr2hgwDR4rO8YhmOz3F/GneHacbc11pZ2pmPsTMeo1N1c5g9zuT/MUl8ZP+g+PObEA7XwkyqE1pzj4Cp0OUL+yyuk6Rj26KVPTp4pO1b9VIWS1rJLxVi/xuGuxZHBf7wyLlUld5rjp5BvuRzZNa6Sb7Va5Q/zx6Gus/7yzNljL7ulkl9FwUHhNwPtDJlGsaX2lE46IK25NK39x/CpGst9Ia4KVLDMF+LX/e1jLhGloqAoCunCMUkWQn2Vy0O0sP+VhZUdklbppJWsbZ/y/HIA7RTPX6xOzo4O+eNmOA6/HWgfcwjHmUjZ1piv01B4qKqZAdPgV/3tpG2LtaEKNgYrxyg9vk9SMT5JxSjXXVzmD7PKF2aRJ8hjfW0lrZHDFMCFQrwwfCVRKBPS9GIYLStcMJ/8t5Wyxp/oNHzquk8xiU9cXOQ3KcQY3IqKR1HpzmUxHJtyzcVKX9kZbUNTFK4vq6Jcd9Fv5ngj1suRbAqvopbMhParGuW6G09hcotbUTlY6Ho/mEniVlSuDpSjKQrVLg9Vurs4QP9MJG2LMs1FUMtfX/pU7ZIe+ZQsfNkt8YYY3tOTv7w6C601iwuzht2KWgz1kB9jV+Xy4FZUbgvX4lFV9ha64V2Kwp2ROi4PhNkUz09EqtbdVIyztNbZ8KgaPlVjwMwRNQ3cisrScZbDGY8CbAhV0uL2k7Et3k8O8Uah69+vnmhr8KkaLR4fmqKw3FeGrzA+GeBAJknWsbguVIVf1QhqOqsCYWKWSVtu4uHaAaKWQURzUVOYiDXcSnuxSlpmfpywN4RX1QhoWvF8ezcxQFjXWeWPYDgOMcvEparn9UKvXHfhVlRasynStkVEc7HIc2az4IOazt2ROip0N4OmwZuxPg5mk+gjLnKHLSz8rVzujxDRXWxPRwHYkYpiOQ6X+8MoQL3Ly3xvgG4jUxxqNBE5xyZmmczy+IpB1XuKi0Ux/UmLphBjSNkWHbkMq4MRlvlCmDj0mNkz+oIo19w0uLxcXhXGcBwcB1yqwpbEQPGKH/Lh5iuFcWu245SsxbgvE2dbwsOqQL41VFEUeowsm+Jnvhbop6koN5VV862aOeQcC8NxeKx37NaKS0G/meOTVJRlvjK+WzcPG4c96XhxbB7kJyms8JVxe7iW60JVuFSV3/UfLx5/XVH4UkUjXlXDwWFbcrDYanl1sKIY+m4sqypuM2aZ/LjnKKdu15uYjG2xpzD+7Xt187Ac54wXqVdQqNTdXO6PoCr5Fke/qnE4m+RI9sQMZ0WB28I1lGkuHByOZFN8msqHiIRl8vJQLzeGq/h27VwU8t39r8d6x+0VGM/WxCCNLh8PV7WQKYxHfbSnlYR9ZpOopousY7M5McDaQDl/VTsHUPhFXxtdRpaDmSTbEkOs8odZEywnbVtoKLwa6zmrsbxjGTANWnNprg6WsyoQxrBtjuZS1BaC/EQEVY2wpvNwVQumkz9zVRR2pWMlLdYO+bGid4RrURWFI9kUHyfz50hnLsuHqSiX+ctY7itDVRS6jQx/GOw840mIf4p2c3ekjj+vmUXGtjEc+6zWuhXTgzIYjcvvTkyaXC7HwMAAW2N97AtN/IPvfNEVBYex78KiFZ4bb01DFQjrblRHYdDO4RQG2luFuwsNX+kPb1spPGY7FEPG8GPDrVz9Zq7k7kTfqJ6F4Tg80X+MSs3NgJUbs0tdUxSqdA9xyyRjmyXd5mO976mOR1VhOZd+c+z3mixr+tMsq62nvLwcXR//GtcwDAYGBtg+0MOnEe+o54f31xpxHFUUVIUx9yffKukmbdtETYOTOyBVFEKaTpmm02fmyBS6KB+pbsGNyqN9rcXfzVjvebKxzreTz5WJPje8vwFNJ6Tq9JrZ4oSP4bqMte9jnZuqohBUdfyqxoCVI1fo4laAL1U2ElB1Hu9ro1xzk7DN4nE4ua4RzZVvmRzjWJ7q720kFYWwruNXNAYso+TCa6SVQxkur6ihoqICl2v8tTdN02RwcJBd3Z1sq/Sd8r1PdrrjD2Ofcyc/71U1KgstginbLCmnKQoVmgtHgUHTGPMOZaeqx+mOqwJEdDeKA1E7v31NUYrnxPBs/5HniD7GZ5WqKFToLnAUhgqfRcOvuLu8jqXeEP+t8yDlupu0bZIc4xzRFYUal4eYaZKyrVGfSSe/73g0JX+BpJIP0xMd+7wonuXqsioqKipwu89f74I4e9Ki+f+3d6+7TSNxFMDPf+yZ4FsoiROotBJCKu+/2kdYad9gtayQWECqikhKLzSg1o5n9oOTbKlycdt1Euzz+4KE2sRpTuyTGXtMjbauSG06GFqUF+esery7v++WPN/8/0Z3Tqi/TVCW3dF09c8UzuHziunyZc+7ytS5xdJKP6tlr9fCwa74E9w4+8NFUndZOFwWOS6XTe/J6vdm3XPetS5rm3LoUI4oTm6dG3r79S/bjmXZLNya14my/FkHjDfk8Muamx5UzaGFw/k0x/l91gqqSZXRtk2fMYfy4pjjFaPNhXM/XAB43+3Y9Hd1uN++atljzjMyzjfc1ELWZ2TqHE7WfN6qZqTYsN+knweLJtEOXdlpo9a2bJJJMV17V6Emmay5OIMIKE8nWvUlhWgdFk2iHfr1rFynj1Vz//x2Xq7h1/T3xqFcU1KweTqT2uv3r6f4Q75s9XQbagYWTaId2vZt96i6Nr03eYteKz3M1DmWTHqQdswLERERPkot2QAAA5tJREFUEdHWsWgSERERUS1YNImIiIioFiyaRERERFQLFk0iIiIiqgWLJhERERHVgkWTtkK4KkbrLblb4/qfZ2Za774ZuG/GqHm439g/LJpUKxGBiMAUXKevzZR18J2DSLUqoJSC5pp9raedg1LVDlMiAt85qKr3BaVGMoVdHHdoP7BoUq1EBJ7noZsVEBaH1vKLAgHKLGw6AIgIlFKICwdl+QWlrZS1ZQaUqpQZz/MQQODzdpqtJc6hmxWV9jO0PSyaVCsRgfZ9HGiD5yenu94c2pHDT2eIOx34vl+pNGjfR1cbHB6Pt7SFtG8Oj8foagNdMTO+7yPudHD46WxLW0j75vnJKQ4qZoa2h0WTaiUi0MYg6SZ4dWORjC92vUm0Zb2TU7x0HuI4gda6WtE0BkmS4FUhOPjM4tA2B5/P8KoQJEkCbUy1zGiNOE7w0nno8Utt6yTji/IY062WGdoeFk2qlVIKxhjEcYJhmuL16ALP3h1D5TnAadHGEmvhXWcYvHmPo6trpGmKKIoqjWgqpaC1RhTHGAwGODqboP/2I9RNxsw0mbVQNxn6bz/i6GyCwWCAKI6htd54nuZ8RDOKIqRpiqOrawzevId3nUGYmeayFirP8ezdMV6PLjBMU8RxAmNM5XN7qX7+rjeAmk8phTAMkfZTOOdgRmN8+fMfTJxF7iwsz91sFCUKRgSJ8pB2n2I4HKLf6yEIAnieV+0xlEIQBOj3+rDWwYxHOP3rA65cgdw5WMfy0CRKFLQIEvGQdrsYvBii3+sjCILKhcHzvFlmenDOQo9GOP37A65sgYyZaRwlAi0KsSj04y6Gv7xA2k8RhiFL5p5h0aTa/TetFUOUQhCEePb1Et+/fUeWZ7CFhQPLZhMIBJ7vwWiDKI7Q7T5FkiQIgqDSaObc7VFNmZXOg3lmsgxFUTAzDSGzi8SMMQijcJGZMAwrjWYuHmc2qhlGEQZK4cmTMjPfJt+Q5RmKKTPTFAKB8hSM/jEz0SwznDbfL3J+ecVPHm2FtRbWWmRZhuzmBlmeoygKWE5tNcZ8WRF/VjZNp7MoCw8ZZbidmTzLkOUZplNmpmmUUovMaGMWU5+PyUye57P9TJkZ5xwcZ08aQylVfkHRGqbTeVRmqF4smrRV8529tXbxLzXLvGzOlyl67Jp2zEw7zLNSR2ZYMpvp/8wM1YdT57RVtwsIURXMDN0XM0O0P/gpJCIiIqJasGgSERERUS3+BdUVm5gy7sR5AAAAAElFTkSuQmCC)
图 9-8 HTTP 标准库的层级结构
每个 net/http.RoundTripper 接口的实现都包含了一种向远程发出请求的过程;标准库中也提供了 net/http.Handler 的多种实现为客户端的 HTTP 请求提供不同的服务。
9.2.2 客户端
客户端可以直接通过 net/http.Get 使用默认的客户端 net/http.DefaultClient 发起 HTTP 请求,也可以自己构建新的 net/http.Client 实现自定义的 HTTP 事务,在多数情况下使用默认的客户端都能满足我们的需求,不过需要注意的是使用默认客户端发出的请求没有超时时间,所以在某些场景下会一直等待下去。除了自定义 HTTP 事务之外,我们还可以实现自定义的 net/http.CookieJar 接口管理和使用 HTTP 请求中的 Cookie:
![](data:image/png;base64,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)
图 9-9 事务和 Cookie
事务和 Cookie 是我们在 HTTP 客户端包为我们提供的两个最重要模块,本节将从 HTTP GET 请求开始,按照构建请求、数据传输、获取连接以及等待响应几个模块分析客户端的实现原理。当我们调用 net/http.Client.Get 发出 HTTP 时,会按照如下的步骤执行:
1.调用 net/http.NewRequest 根据方法名、URL 和请求体构建请求;
2.调用 net/http.Transport.RoundTrip 开启 HTTP 事务、获取连接并发送请求;
3.在 HTTP 持久连接的 net/http.persistConn.readLoop 方法中等待响应;
![](data:image/png;base64,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)
图 9-10 客户端的几大结构体
HTTP 的客户端中包含几个比较重要的结构体,它们分别是 net/http.Client、net/http.Transport 和 net/http.persistConn:
net/http.Client 是 HTTP 客户端,它的默认值是使用 net/http.DefaultTransport 的 HTTP 客户端;
net/http.Transport 是 net/http.RoundTripper 接口的实现,它的主要作用就是支持 HTTP/HTTPS 请求和 HTTP 代理;
net/http.persistConn 封装了一个 TCP 的持久连接,是我们与远程交换消息的句柄(Handle);
客户端 net/http.Client 是级别较高的抽象,它提供了 HTTP 的一些细节,包括 Cookies 和重定向;而 net/http.Transport 会处理 HTTP/HTTPS 协议的底层实现细节,其中会包含连接重用、构建请求以及发送请求等功能。
构建请求
net/http.Request 表示 HTTP 服务接收到的请求或者 HTTP 客户端发出的请求,其中包含 HTTP 请求的方法、URL、协议版本、协议头以及请求体等字段,除了这些字段之外,它还会持有一个指向 HTTP 响应的引用:
type Request struct {
Method string
URL * url.URL
Proto string // "HTTP/1.0"
ProtoMajor int // 1
ProtoMinor int // 0
Header Header
Body io.ReadCloser
...
Response * Response
}
net/http.NewRequest 是标准库提供的用于创建请求的方法,这个方法会校验 HTTP 请求的字段并根据输入的参数拼装成新的请求结构体。
func NewRequestWithContext(ctx context.Context, method, url string, body io.Reader)( * Request, error) {
if method == "" {
method = "GET"
}
if !validMethod(method) {
return nil, fmt.Errorf("net/http: invalid method %q", method)
}
u, err: = urlpkg.Parse(url)
if err != nil {
return nil, err
}
rc, ok: = body.(io.ReadCloser)
if !ok && body != nil {
rc = ioutil.NopCloser(body)
}
u.Host = removeEmptyPort(u.Host)
req: = & Request {
ctx: ctx,
Method: method,
URL: u,
Proto: "HTTP/1.1",
ProtoMajor: 1,
ProtoMinor: 1,
Header: make(Header),
Body: rc,
Host: u.Host,
}
if body != nil {
...
}
return req, nil
}
请求拼装的过程比较简单,它会检查并校验输入的方法、URL 以及负载,然而初始化了新的 net/http.Request 结构,处理负载的过程稍微有一些复杂,我们会根据负载的类型不同,使用不同的方法将它们包装成 io.ReadCloser 类型。
开启事务
当我们使用标准库构建了 HTTP 请求之后,会开启 HTTP 事务发送 HTTP 请求并等待远程的响应,经过下面一连串的调用,我们最终来到了标准库实现底层 HTTP 协议的结构体 — net/http.Transport:
1.net/http.Client.Do
2.net/http.Client.do
3.net/http.Client.send
4.net/http.send
5.net/http.Transport.RoundTrip
net/http.Transport 实现了 net/http.RoundTripper 接口,也是整个请求过程中最重要并且最复杂的结构体,该结构体会在 net/http.Transport.roundTrip 中发送 HTTP 请求并等待响应,我们可以将该函数的执行过程分成两个部分:
1.根据 URL 的协议查找并执行自定义的 net/http.RoundTripper 实现;
2.从连接池中获取或者初始化新的持久连接并调用连接的 net/http.persistConn.roundTrip 发出请求;
我们可以在标准库的 net/http.Transport 中调用 net/http.Transport.RegisterProtocol 为不同的协议注册 net/http.RoundTripper 的实现,在下面的这段代码中就会根据 URL 中的协议选择对应的实现来替代默认的逻辑:
func(t * Transport) roundTrip(req * Request)( * Response, error) {
ctx: = req.Context()
scheme: = req.URL.Scheme
if altRT: = t.alternateRoundTripper(req);altRT != nil {
if resp, err: = altRT.RoundTrip(req);
err != ErrSkipAltProtocol {
return resp, err
}
}
...
}
在默认情况下,我们都会使用 net/http.persistConn 持久连接处理 HTTP 请求,该方法会先获取用于发送请求的连接,随后调用 net/http.persistConn.roundTrip:
func(t * Transport) roundTrip(req * Request)( * Response, error) {
...
for {
select {
case <-ctx.Done():
return nil, ctx.Err()
default:
}
treq: = & transportRequest {
Request: req,
trace: trace
}
cm, err: = t.connectMethodForRequest(treq)
if err != nil {
return nil, err
}
pconn, err: = t.getConn(treq, cm)
if err != nil {
return nil, err
}
resp, err: = pconn.roundTrip(treq)
if err == nil {
return resp, nil
}
}
}
net/http.Transport.getConn 是获取连接的方法,该方法会通过两种方法获取用于发送请求的连接:
func(t * Transport) getConn(treq * transportRequest, cm connectMethod)(pc * persistConn, err error) {
req: = treq.Request
ctx: = req.Context()
w: = & wantConn {
cm: cm,
key: cm.key(),
ctx: ctx,
ready: make(chan struct {}, 1),
}
if delivered: = t.queueForIdleConn(w);delivered {
return w.pc, nil
}
t.queueForDial(w)
select {
case <-w.ready:
...
return w.pc, w.err
...
}
}
1.调用 net/http.Transport.queueForIdleConn 在队列中等待闲置的连接;
2.调用 net/http.Transport.queueForDial 在队列中等待建立新的连接;
连接是一种相对比较昂贵的资源,如果在每次发出 HTTP 请求之前都建立新的连接,可能会消耗比较多的时间,带来较大的额外开销,通过连接池对资源进行分配和复用可以有效地提高 HTTP 请求的整体性能,多数的网络库客户端都会采取类似的策略来复用资源。
当我们调用 net/http.Transport.queueForDial 尝试与远程建立连接时,标准库会在内部启动新的 Goroutine 执行 net/http.Transport.dialConnFor 用于建连,从最终调用的 net/http.Transport.dialConn 中我们能找到 TCP 连接和 net 库的身影:
func(t * Transport) dialConn(ctx context.Context, cm connectMethod)(pconn * persistConn, err error) {
pconn = & persistConn {
t: t,
cacheKey: cm.key(),
reqch: make(chan requestAndChan, 1),
writech: make(chan writeRequest, 1),
closech: make(chan struct {}),
writeErrCh: make(chan error, 1),
writeLoopDone: make(chan struct {}),
}
conn, err: = t.dial(ctx, "tcp", cm.addr())
if err != nil {
return nil, err
}
pconn.conn = conn
pconn.br = bufio.NewReaderSize(pconn, t.readBufferSize())
pconn.bw = bufio.NewWriterSize(persistConnWriter {
pconn
}, t.writeBufferSize())
go pconn.readLoop()
go pconn.writeLoop()
return pconn, nil
}
在创建新的 TCP 连接后,我们还会在后台为当前的连接创建两个 Goroutine,分别从 TCP 连接中读取数据或者向 TCP 连接写入数据,从建立连接的过程我们可以发现,如果我们为每一个 HTTP 请求都创建新的连接并启动 Goroutine 处理读写数据,会占用很多的资源。
等待请求
持久的 TCP 连接会实现 net/http.persistConn.roundTrip 处理写入 HTTP 请求并在 select 语句中等待响应的返回:
func(pc * persistConn) roundTrip(req * transportRequest)(resp * Response, err error) {
writeErrCh: = make(chan error, 1)
pc.writech < -writeRequest {
req, writeErrCh, continueCh
}
resc: = make(chan responseAndError)
pc.reqch < -requestAndChan {
req: req.Request,
ch: resc,
}
for {
select {
case re:
= < -resc:
if re.err != nil {
return nil, pc.mapRoundTripError(req, startBytesWritten, re.err)
}
return re.res, nil
...
}
}
}
每个 HTTP 请求都由另一个 Goroutine 中的 net/http.persistConn.writeLoop 循环写入的,这两个 Goroutine 独立执行并通过 Channel 进行通信。net/http.Request.write 会根据 net/http.Request 结构中的字段按照 HTTP 协议组成 TCP 数据段:
func(pc * persistConn) writeLoop() {
defer close(pc.writeLoopDone)
for {
select {
case wr:
= < -pc.writech:
startBytesWritten: = pc.nwrite
wr.req.Request.write(pc.bw, pc.isProxy, wr.req.extra, pc.waitForContinue(wr.continueCh))
...
case < -pc.closech:
return
}
}
}
当我们调用 net/http.Request.write 向请求中写入数据时,实际上直接写入了 net/http.persistConnWriter 中的 TCP 连接中,TCP 协议栈会负责将 HTTP 请求中的内容发送到目标服务器上:
type persistConnWriter struct {
pc * persistConn
}
func(w persistConnWriter) Write(p[] byte)(n int, err error) {
n, err = w.pc.conn.Write(p)
w.pc.nwrite += int64(n)
return
}
持久连接中的另一个读循环 net/http.persistConn.readLoop 会负责从 TCP 连接中读取数据并将数据发送会 HTTP 请求的调用方,真正负责解析 HTTP 协议的还是 net/http.ReadResponse:
func ReadResponse(r * bufio.Reader, req * Request)( * Response, error) {
tp: = textproto.NewReader(r)
resp: = & Response {
Request: req,
}
line,
_: = tp.ReadLine()
if i: = strings.IndexByte(line, ' ');i == -1 {
return nil, badStringError("malformed HTTP response", line)
} else {
resp.Proto = line[: i]
resp.Status = strings.TrimLeft(line[i + 1: ], " ")
}
statusCode: = resp.Status
if i: = strings.IndexByte(resp.Status, ' ');i != -1 {
statusCode = resp.Status[: i]
}
resp.StatusCode,
err = strconv.Atoi(statusCode)
resp.ProtoMajor,
resp.ProtoMinor,
_ = ParseHTTPVersion(resp.Proto)
mimeHeader,
_: = tp.ReadMIMEHeader()
resp.Header = Header(mimeHeader)
readTransfer(resp, r)
return resp,
nil
}
我们在上述方法中可以看到 HTTP 响应结构的大致框架,其中包含状态码、协议版本、请求头等内容,响应体还是在读取循环 net/http.persistConn.readLoop 中根据 HTTP 协议头进行解析的。
9.2.3 服务器
Go 语言标准库 net/http 包提供了非常易用的接口,如下所示,我们可以利用标准库提供的功能快速搭建新的 HTTP 服务:
func handler(w http.ResponseWriter, r * http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1: ])
}
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
上述的 main 函数只调用了两个标准库提供的函数,它们分别是用于注册处理器的 net/http.HandleFunc 函数和用于监听和处理器请求的 net/http.ListenAndServe,多数的服务器框架都会包含这两类接口,分别负责注册处理器和处理外部请求,这一种非常常见的模式,我们在这里也会按照这两个维度介绍标准库如何支持 HTTP 服务器的实现。
注册处理器
HTTP 服务是由一组实现了 net/http.Handler 接口的处理器组成的,处理 HTTP 请求时会根据请求的路由选择合适的处理器:
![](data:image/png;base64,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)
图 9-11 HTTP 服务与处理器
当我们直接调用 net/http.HandleFunc 注册处理器时,标准库会使用默认的 HTTP 服务器 net/http.DefaultServeMux 处理请求,该方法会直接调用 net/http.ServeMux.HandleFunc:
func(mux * ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, * Request)) {
mux.Handle(pattern, HandlerFunc(handler))
}
上述方法会将处理器转换成 net/http.Handler 接口类型调用 net/http.ServeMux.Handle 注册处理器:
func (mux *ServeMux) Handle(pattern string, handler Handler) {
if _, exist := mux.m[pattern]; exist {
panic("http: multiple registrations for " + pattern)
}
e := muxEntry{h: handler, pattern: pattern}
mux.m[pattern] = e
if pattern[len(pattern)-1] == '/' {
mux.es = appendSorted(mux.es, e)
}
if pattern[0] != '/' {
mux.hosts = true
}
}
路由和对应的处理器会被组成 net/http.DefaultServeMux,该结构会持有一个 net/http.muxEntry 哈希,其中存储了从 URL 到处理器的映射关系,HTTP 服务器在处理请求时就会使用该哈希查找处理器。
处理请求
标准库提供的 net/http.ListenAndServe 可以用来监听 TCP 连接并处理请求,该函数会使用传入的监听地址和处理器初始化一个 HTTP 服务器 net/http.Server,调用该服务器的 net/http.Server.ListenAndServe 方法:
func ListenAndServe(addr string, handler Handler) error {
server: = & Server {
Addr: addr,
Handler: handler
}
return server.ListenAndServe()
}
net/http.Server.ListenAndServe 会使用网络库提供的 net.Listen 监听对应地址上的 TCP 连接并通过 net/http.Server.Serve 处理客户端的请求:
func(srv * Server) ListenAndServe() error {
if addr == "" {
addr = ":http"
}
ln, err: = net.Listen("tcp", addr)
if err != nil {
return err
}
return srv.Serve(ln)
}
net/http.Server.Serve 会在循环中监听外部的 TCP 连接并为每个连接调用 net/http.Server.newConn 创建新的 net/http.conn,它是 HTTP 连接的服务端表示:
func(srv * Server) Serve(l net.Listener) error {
l = & onceCloseListener {
Listener: l
}
defer l.Close()
baseCtx: = context.Background()
ctx: = context.WithValue(baseCtx, ServerContextKey, srv)
for {
rw, err: = l.Accept()
if err != nil {
select {
case <-srv.getDoneChan():
return ErrServerClosed
default:
}
...
return err
}
connCtx: = ctx
c: = srv.newConn(rw)
c.setState(c.rwc, StateNew) // before Serve can return
go c.serve(connCtx)
}
}
创建了服务端的连接之后,标准库中的实现会为每个 HTTP 请求创建单独的 Goroutine 并在其中调用 net/http.Conn.serve 方法,如果当前 HTTP 服务接收到了海量的请求,会在内部创建大量的 Goroutine,这可能会使整个服务质量明显降低无法处理请求。
func(c * conn) serve(ctx context.Context) {
c.remoteAddr = c.rwc.RemoteAddr().String()
ctx = context.WithValue(ctx, LocalAddrContextKey, c.rwc.LocalAddr())
ctx, cancelCtx: = context.WithCancel(ctx)
c.cancelCtx = cancelCtx
defer cancelCtx()
c.r = & connReader {
conn: c
}
c.bufr = newBufioReader(c.r)
c.bufw = newBufioWriterSize(checkConnErrorWriter {
c
}, 4 << 10)
for {
w, _: = c.readRequest(ctx)
serverHandler {
c.server
}.ServeHTTP(w, w.req)
w.finishRequest()
...
}
}
上述代码片段是我们简化后的连接处理过程,其中包含读取 HTTP 请求、调用 Handler 处理 HTTP 请求以及调用完成该请求。读取 HTTP 请求会调用 net/http.Conn.readRequest,该方法会从连接中获取 HTTP 请求并构建一个实现了 net/http.ResponseWriter 接口的变量 net/http.response,向该结构体写入的数据都会被转发到它持有的缓冲区中:
func(w * response) write(lenData int, dataB[] byte, dataS string)(n int, err error) {
...
w.written += int64(lenData)
if w.contentLength != -1 && w.written > w.contentLength {
return 0, ErrContentLength
}
if dataB != nil {
return w.w.Write(dataB)
} else {
return w.w.WriteString(dataS)
}
}
解析了 HTTP 请求并初始化 net/http.ResponseWriter 之后,我们就可以调用 net/http.serverHandler.ServeHTTP 查找处理器来处理 HTTP 请求了:
type serverHandler struct {
srv * Server
}
func(sh serverHandler) ServeHTTP(rw ResponseWriter, req * Request) {
handler: = sh.srv.Handler
if handler == nil {
handler = DefaultServeMux
}
if req.RequestURI == "*" && req.Method == "OPTIONS" {
handler = globalOptionsHandler {}
}
handler.ServeHTTP(rw, req)
}
如果当前的 HTTP 服务器中不包含任何处理器,我们会使用默认的 net/http.DefaultServeMux 处理外部的 HTTP 请求。
net/http.ServeMux 是一个 HTTP 请求的多路复用器,它可以接收外部的 HTTP 请求、根据请求的 URL 匹配并调用最合适的处理器:
func(mux * ServeMux) ServeHTTP(w ResponseWriter, r * Request) {
h, _: = mux.Handler(r)
h.ServeHTTP(w, r)
}
经过一系列的函数调用,上述过程最终会调用 HTTP 服务器的 net/http.ServerMux.match,该方法会遍历前面注册过的路由表并根据特定规则进行匹配:
func(mux * ServeMux) match(path string)(h Handler, pattern string) {
v, ok: = mux.m[path]
if ok {
return v.h, v.pattern
}
for _, e: = range mux.es {
if strings.HasPrefix(path, e.pattern) {
return e.h, e.pattern
}
}
return nil, ""
}
如果请求的路径和路由中的表项匹配成功,我们会调用表项中对应的处理器,处理器中包含的业务逻辑会通过 net/http.ResponseWriter 构建 HTTP 请求对应的响应并通过 TCP 连接发送回客户端。
总结
Go 语言的 HTTP 标准库提供了非常丰富的功能,很多语言的标准库只提供了最基本的功能,实现 HTTP 客户端和服务器往往都需要借助其他开源的框架,但是 Go 语言的很多项目都会直接使用标准库实现 HTTP 服务器,这也从侧面说明了 Go 语言标准库的价值。