HTTP/1.1 客户端如何知道在存在“Connection: keep-alive”头字段但没有“Content-Length”的情况下消息在哪里结束?

Posted

技术标签:

【中文标题】HTTP/1.1 客户端如何知道在存在“Connection: keep-alive”头字段但没有“Content-Length”的情况下消息在哪里结束?【英文标题】:How does a HTTP/1.1 client know where a message ends in presence of `Connection: keep-alive` header field but absence of `Content-Length`? 【发布时间】:2018-08-29 06:43:26 【问题描述】:

特别是,我有一个来自 nginx 服务器的响应头:

HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Tue, 20 Mar 2018 10:28:24 GMT
Content-Type: text/html
Last-Modified: Thu, 28 Jan 2016 10:50:21 GMT
Connection: keep-alive
ETag: W/"56a9f26d-2d97"
Content-Encoding: gzip

随后是大约 3352 字节的压缩数据。我正在尝试找出客户端如何知道此消息的正文在哪里结束以及新的响应开始的位置。

【问题讨论】:

我认为gzip 包含标题中的大小 【参考方案1】:

它没有。响应需要 Content-Length 响应头字段,或者必须使用“Transfer-Encoding: chunked”。

【讨论】:

你是对的。我用curl -I <URL>(发送HEAD请求)instead of curl -sD - <URL> -o /dev/null生成了上面的HTTP头,所以响应缺少Transfer-Encoding: chunked头字段。

以上是关于HTTP/1.1 客户端如何知道在存在“Connection: keep-alive”头字段但没有“Content-Length”的情况下消息在哪里结束?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制客户端使用 http/2? (而不是回退到 http 1.1)

HTTP 1.1 TE 标头

HTTP

HTTPS详解

在 Socket.io android 客户端 v1.4 中处理回调

我如何从客户端知道一个帐户是不是存在于 XMPP 服务器中?