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 检测流结束
Apache HttpClient 未显示响应的 Content-Length 和 Content-Encoding 标头