首页 文章

gzip压缩分块编码响应?

提问于
浏览
30

我试图让我的网络服务器正确gzip一个块响应编码的http响应 .

我对非gzip响应的理解是它看起来像这样:

<the response headers>

然后对于每个块,

<chunk length in hex>\r\n<chunk>\r\n

最后,一个零长度的块:

0\r\n\r\n

我试图让gzip压缩工作,我可以使用一些帮助找出实际应该返回的内容 . 这个文档暗示整个响应应该被gzip压缩,而不是gzipping每个块:

HTTP servers sometimes use compression (gzip) or deflate methods to optimize transmission.
Chunked transfer encoding can be used to delimit parts of the compressed object.
In this case the chunks are not individually compressed. Instead, the complete payload 
is compressed and the output of the compression process is chunk encoded.

我尝试gzip整个事情并返回响应,即使没有分块,它没有工作 . 我尝试将Content-Encoding标头设置为“gzip” . 有人可以解释必须对上述方案进行哪些更改才能支持gzipping的大块?谢谢 .

3 回答

  • 32

    你gzip内容,然后才应用chunked编码:

    “由于”chunked“是HTTP / 1.1接收者需要理解的唯一传输编码,因此它在分隔持久连接上的消息方面起着至关重要的作用 . 每当传输编码应用于请求中的有效载荷主体时,应用的最终传输编码必须是“分块” . 如果传输编码应用于响应有效载荷主体,则应用的最终传输编码必须“分块”或者必须通过关闭连接来终止消息 . 使用“分块”传输编码,它必须是用于形成消息体的最后一个传输编码 . “分块”传输编码绝不能在消息体中多次应用 . “

    HTTPbis Part1, Section 6.2.1

  • 1

    可能你并没有真正发送适当的gzipped响应 .

    尝试在zlib中将 window bits 设置为 31 . 并使用 deflateInit2() .

  • 22

    如果其他答案不够明确:

    首先你用zlib gzip body(这可以在一个流中完成,所以你不需要一次在内存中的整个事情,这是分块的整个点) .

    然后使用Content-Encoding:gzip和Transfer-Encoding:chunked标头(并且没有Content-Length)以块(可能是gzip流提供的块,使用块标头声明它有多长)发送该压缩体头) .

    如果您使用gzip或zcat或某些此类实用程序进行压缩,则可能无法正常工作 . 需要成为zlib . 如果您正在创建块然后压缩它们,那肯定是行不通的 . 如果您认为自己正在做这件事并且无法正常工作,那么您可能会尝试进行数据包跟踪并根据该问题以及您收到的任何错误消息提出问题 .

相关问题