【问题标题】:Is it possible to send HTTP response using GZIP and byte ranges at the same time?是否可以同时使用 GZIP 和字节范围发送 HTTP 响应?
【发布时间】:2015-11-26 21:57:16
【问题描述】:

请求:

...
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?

【问题讨论】:

    标签: http range gzip


    【解决方案1】:

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

    Content-Encoding 如果您要求一个字节范围将不起作用:这意味着服务器对整个文档进行编码,并且如果整个内容使用 gzip 编码并且您只请求一个范围,您将不会'没有足够的知识来解压缩它。 (你不能解压缩部分 gzip,或者至少不能没有它的开始。)

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

    不直观地,当您请求带有 Accept-Encoding 标头的 Content-Encoding 时,您请求带有 TE 标头的 Transfer-Encoding

    然而,这就是事情变得棘手的地方:很少有网络服务器支持它。例如,如果您从 CloudFlare 提取内容,您会发现它们没有。

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

    【讨论】:

    • 字节范围是原始未压缩有效载荷还是压缩有效载荷?我想应该是前者吧?我是这么认为的,因为据我了解,每个块都是单独压缩的。
    • @Khoi 是的,没错!您正在根据存储在服务器上的内容指定一个范围。这里没有Content-Encoding
    • 我后来发现你不能在 Chrome 中发送 TE 标头,它也不能解析 Transfer-Encoding: gzip, chunked 响应。感觉我们距离在浏览器中看到这一点还有好几年的时间。
    • 我认为答案不正确,如nginx forum here 中所述。还有this source on w3 standard mailing lists 表示您可以在内容编码的有效负载上请求范围。
    • 这些链接肯定支持答案:“内容编码:gzip 实际上是用词不当,因为在大多数情况下它实际上用作传输编码”,“范围请求 + gzip 压缩提供了巨大的性能提升,但由于上述原因,如果不使用 gzip 传输编码是不可能的(以合规的方式),等等。您可以根据 RFC 合法请求的内容与许多服务器支持的内容之间存在差异!
    猜你喜欢
    • 2017-03-10
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多