2011-03-12 104 views
25

我试图让我的web服务器正确地gzip一个http响应,它是块编码。分块编码响应的gzip压缩?

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

<the response headers> 

,然后对于每个大块,

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

终于,零长度块:

0\r\n\r\n 

我试图让gzip压缩工作,我可以使用一些帮助确定什么应该交流一定会被退回。本文档意味着整个响应应该用gzip压缩,而不是使用gzip压缩每个块:

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”。有人可以解释一下上面的方案必须做什么改变来支持gzip块吗?谢谢。

回答

19

您gzip压缩的内容,然后才申请的分块编码:

“自‘分块’是唯一的传输编码必须通过HTTP/1.1接收者可以理解,它在划定的消息了至关重要的作用在一个持久连接上,每当一个转移编码被应用到一个请求中的一个有效载荷体上时,所应用的最后一个转移编码必须是“chunked”的,如果一个转移编码被应用到一个响应有效载荷体上, - 应用的编码必须是“分块的”,或者必须通过关闭连接来终止消息,当使用“分块”传输编码时,它必须是最后一个用于形成消息体的传输编码,“分块”传递编码绝不能在消息体中多次应用。“

HTTPbis Part1, Section 6.2.1

+0

他说他在做什么,对吧? – sosiouxme 2012-01-19 21:19:49

+1

第一句话在这真是令人困惑。我认为它应该改变.....你gzip每个块的身体(我刚刚实施它,它像一个魅力工作)。您不会gzip整个内容,然后应用分块编码。你可以gzip每个主体并将块大小标记为压缩的字节数组大小。 – 2016-08-30 04:27:09

1

可能你并没有真正发送一个适当的gzip响应。

尝试在zlib中设置window bits31。并使用deflateInit2()

+1

这对实现做了一些假设。如果要返回一个压缩文件,他只是使用“gzip”命令压缩文件,并在设置Content-Encoding:gzip头文件时返回该文件?它有相同的输出吗? – sosiouxme 2012-01-19 21:21:52

+0

HTTP标准确实需要使用** zlib **库。 'gzip'命令会输出更多的头文件,但是应该与大多数其他HTTP客户端/服务器中使用的zlib兼容。 – unixman83 2012-01-20 18:31:20

+0

更有可能是海报未设置“Content-Length”标头或发送的是分块响应不正确。或者在标题后忘记了一些基本的东西,比如尾随的换行符。 – unixman83 2012-01-20 18:33:08

24

如果其他的答案还不够明确:

首先你gzip压缩的身体与zlib的(这可以在流来完成,所以你并不需要整个事情在内存中,这是整块的重点)。

然后,你用块发送压缩主体(大概是由gzip流提供的那个,块头用来声明它有多长),使用Content-Encoding:gzip和Transfer-Encoding:chunked headers(和没有内容长度标题)。

如果您使用gzip或zcat或某些此类实用程序进行压缩,则可能无法使用。需要是zlib。如果你正在创建块并压缩它们,那肯定无法工作。如果您认为自己做得对并且无法正常工作,那么您可以尝试使用数据包跟踪并根据您收到的错误消息提出问题。