HTTP传输编码“ gzip,分块”未正确解释

时间:2019-07-09 18:05:26

标签: java http encoding

我目前正在用Java实现HTTP服务器,但是在传输编码时遇到了一个问题。

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Encoding: gzip
Transfer-Encoding: chunked

正常工作,仅使用gzipchunked作为传输编码,如下所示:

Transfer-Encoding: gzip, chunked

导致浏览器无法正确显示响应。

Chrome浏览器尝试将资源下载为.gz文件的同时,Firefox尝试显示资源,结果是这样:

Expected output: Hello world!

关于这一点的奇怪之处在于,服务器生成的消息正文与将gzip用作Content-Encoding时完全相同,因为RFC7230允许在应用了最后一种编码的情况下应用多种传输编码是chunked

  

例如,

Transfer-Encoding: gzip, chunked
     

表示有效载荷主体已使用gzip压缩     编码,然后使用分块编码进行分块,同时形成     邮件正文。

这是服务器的原始响应:

HTTP/1.1 200 OK
Date: Tue, 09 Jul 2019 17:52:41 GMT
Server: jPuzzle
Content-Type: text/plain
Transfer-Encoding: gzip, chunked

1c
       òHÍÉÉW(Ï/ÊIQ   ÿÿ
a
    
0

正如人们所猜测的那样,在此之后将尸体压缩并切块。

我将不胜感激,因为我看不到违反规范的地方。

1 个答案:

答案 0 :(得分:1)

您应将content-encoding标头用于end to end compression

  

Transfer-Encoding是逐跳标头,应用于两个节点之间的消息,而不是资源本身。多节点连接的每个段可以使用不同的“传输编码”值。如果要压缩整个连接上的数据,请改用端到端Content-Encoding标头。

此外,发送Accept-Encoding: gzip请求标头以告知服务器客户端期望什么。