HTTP 分块传输编码
HTTP Chunked transfer encoding
来自维基百科:
For version 1.1 of the HTTP protocol, the chunked transfer mechanism is considered to be always and anyways acceptable, even if not listed in the TE (transfer encoding) request header field
这就是我从客户(Mozilla、Opera)那里得到的信息:
GET http://www.google.com/ HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
显然那里既没有 Transfer-Encoding 字段,也没有看到任何块(我用 HEX 编辑器检查过,没有额外的符号)。
我打开连接如下(Python)
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
是否是较低级别的处理将块连接到消息中?是这样,我怎么知道 HTTP 消息在哪里结束,以便我可以停止读取请求并开始处理它?
您应该阅读规范。
但简单地说,在这种情况下,因为它是 GET,并且没有内容,所以不会有 Content-Length header。所以,当你得到只有 CR/LF.
的空行时,你就停止阅读了
否则,您阅读了该空行,并阅读了 Content-Length 个字节。
来自维基百科:
For version 1.1 of the HTTP protocol, the chunked transfer mechanism is considered to be always and anyways acceptable, even if not listed in the TE (transfer encoding) request header field
这就是我从客户(Mozilla、Opera)那里得到的信息:
GET http://www.google.com/ HTTP/1.1 Host: www.google.com User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive
显然那里既没有 Transfer-Encoding 字段,也没有看到任何块(我用 HEX 编辑器检查过,没有额外的符号)。
我打开连接如下(Python)
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
是否是较低级别的处理将块连接到消息中?是这样,我怎么知道 HTTP 消息在哪里结束,以便我可以停止读取请求并开始处理它?
您应该阅读规范。
但简单地说,在这种情况下,因为它是 GET,并且没有内容,所以不会有 Content-Length header。所以,当你得到只有 CR/LF.
的空行时,你就停止阅读了否则,您阅读了该空行,并阅读了 Content-Length 个字节。