是否可以同时使用GZIP和字节范围发送HTTP响应?

时间:2015-11-26 21:57:17

标签: http range gzip

请求:

...
Content-Range: bytes 27482871-41601067/41601068
...

我试过从文件中读取字节,然后再读到GZIP。响应如下:

response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);

...
Server: GlassFish Server Open Source Edition  4.1
X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition  4.1  Java/Oracle Corporation/1.8)
Date: Thu, 26 Nov 2015 21:44:21 GMT
Accept-Ranges: bytes
Connection: keep-alive
Keep-Alive: timeout=1800
Content-Disposition: attachment;filename*=utf-8''Marq_Aurel_Rayman_Rave_-_Intdo_The_Blue_%28Max_R_remix%29.wav
ETag: Marq_Aurel_Rayman_Rave_-_Intdo_The_Blue_%28Max_R_remix%29.wav-41601068-1403655006000
Cache-Control: private,max-age=604800
Last-Modified: Wed, 25 Jun 2014 00:10:06 GMT
Content-Range: bytes 27482871-41601067/41601068
Content-Encoding: gzip
...

如果我暂停并恢复下载,则下载失败。也许我永远不应该在范围响应中使用GZIP?

1 个答案:

答案 0 :(得分:1)

是的。可以请求某个范围内的压缩内容,但只能使用Transfer-Encoding,而不能使用Content-Encoding

Content-Encoding在您要求一定范围的字节时将不起作用:这意味着服务器对整个文档进行了编码,并且如果整个内容都使用gzip进行了编码,而您仅请求了一定范围,不会足够解压缩它。 (您不能解压缩部分gzip,或者至少不能将其解压缩。)

您可以使用Transfer-Encoding代替使用range提供整个压缩文档的一部分。这将为您提供所需的范围,并压缩该范围。好多了!

直觉上,当您请求带有Content-Encoding标头的Accept-Encoding时,您请求带有Transfer-Encoding标头的TE

但是,这就是棘手的地方:很少有Web服务器支持它。例如,如果您从CloudFlare中提取内容,您会发现它们没有。

在这里a discussion from the nginx mailing-list,他们在那里讨论这个问题,这里是another on making it work in HTTP/2