HTTP Content-Encoding gzip 检测流结束

Posted

技术标签:

【中文标题】HTTP Content-Encoding gzip 检测流结束【英文标题】:HTTP Content-Encoding gzip detect end of stream 【发布时间】:2017-02-02 20:33:16 【问题描述】:

我正在开发一个自定义 HTTP 库供我使用。目前我正在实现各种传输类型,当Content-Encoding 设置为gzip 时,我被困在如何从套接字读取所有数据。我检查了GZIP 文件格式,没有指定的迹象表明已到达gzip 文件的结尾。

分块传输指示最后一个块以0\r\n\r\n 结束的位置。 有没有办法检查是否已到达gzip 流的结尾?

【问题讨论】:

【参考方案1】:

gzip 中没有结束流指示器。您必须使用封装层的指示符(即 HTTP)来找出 gzip 流的结束位置,即取决于响应标头的内容长度、分块编码中的最后一个块或 TCP 连接的结束。

【讨论】:

我有一个分块编码的解决方案,但是当只有 Content-Length 和 Content-Encoding 存在时,我不明白如何检测数据结束。有时检查是否有要读取的数据会返回无效结果。另外,Content-Length 是提供 Content-Type 的长度(即解压后)还是传输过程中的内容长度? 如果响应不是chunked,则必须依靠Content-Length 或套接字闭包来检测数据结束。如果存在Content-Length,则它是正在传输的数据的确切字节长度,因此当您读取了那么多字节时停止读取。有关详细信息,请参阅RFC 2616 Section 4.4 Message Length。 HTTP 没有真正的压缩概念(由 HTTP 之外的发送方和接收方处理),因此它不报告未压缩数据的大小。

以上是关于HTTP Content-Encoding gzip 检测流结束的主要内容,如果未能解决你的问题,请参考以下文章

HTTP Content-Encoding gzip 检测流结束

协议分析HTTP响应头中的2种编码方式介绍

Apache HttpClient 未显示响应的 Content-Length 和 Content-Encoding 标头

http响应头

使用 Content-Encoding: br 替换 Content-Encoding: gzip

Content-Encoding值