要求:
...
Content-Range: bytes 27482871-41601067/41601068
...
Run Code Online (Sandbox Code Playgroud)
我试图从文件中读取字节,然后再读取到 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
...
Run Code Online (Sandbox Code Playgroud)
如果我暂停并继续下载,下载将失败。也许我永远不应该在范围响应中使用 GZIP?
是的。可以在一定范围内请求 gzip 压缩的内容,但只能使用Transfer-Encoding
,而不能使用Content-Encoding
。
Content-Encoding
如果您要求一个字节范围,则不起作用:这意味着服务器对整个文档进行编码,如果整个内容是用 gzip 编码的,而您只请求其中的一个范围,那么您将不会了解足够多的信息来解压缩它. (您不能解压缩部分 gzip,或者至少不能在没有开始的情况下解压缩。)
与其使用 range 来提供整个压缩文档的一个块,您还可以使用它Transfer-Encoding
。这将为您提供所需的范围,并压缩该范围。好多了!
不直观的是,当您Content-Encoding
使用Accept-Encoding
标头请求Transfer-Encoding
时,您使用TE
标头进行请求。
然而,这就是事情变得棘手的地方:很少有网络服务器支持它。例如,如果您从 CloudFlare 中提取内容,您会发现它们没有。
这是来自 nginx 邮件列表的讨论,他们在其中讨论了这个问题,这是另一个关于使其在 HTTP/2 中工作的内容。
归档时间: |
|
查看次数: |
1888 次 |
最近记录: |