我目前正在用Java实现HTTP服务器,但是在传输编码时遇到了一个问题。
而
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Encoding: gzip
Transfer-Encoding: chunked
正常工作,仅使用gzip
和chunked
作为传输编码,如下所示:
Transfer-Encoding: gzip, chunked
导致浏览器无法正确显示响应。
Chrome浏览器尝试将资源下载为.gz
文件的同时,Firefox尝试显示资源,结果是这样:
关于这一点的奇怪之处在于,服务器生成的消息正文与将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
正如人们所猜测的那样,在此之后将尸体压缩并切块。
我将不胜感激,因为我看不到违反规范的地方。
答案 0 :(得分:1)
您应将content-encoding
标头用于end to end compression。
Transfer-Encoding是逐跳标头,应用于两个节点之间的消息,而不是资源本身。多节点连接的每个段可以使用不同的“传输编码”值。如果要压缩整个连接上的数据,请改用端到端Content-Encoding标头。
此外,发送Accept-Encoding: gzip
请求标头以告知服务器客户端期望什么。