【问题标题】:HTTP Transfer-Encoding "gzip, chunked" not interpreted correctlyHTTP 传输编码“gzip,分块”未正确解释
【发布时间】:2019-07-09 18:05:26
【问题描述】:

我目前正在用 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 尝试显示它,结果如下:

奇怪的是,服务器生成的消息正文与使用gzip 时的消息正文完全相同,而不是Content-Encoding,因为如果应用的最后一个是chunked,RFC7230 允许应用多个传输编码.

例如,

Transfer-Encoding: gzip, chunked

表示payload body已经被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

正如你所猜想的那样,在此之后主体被压缩并分块。

我将不胜感激任何帮助,因为我看不到哪里违反了规范。

【问题讨论】:

  • 标头可能正确,但传输的数据可能不是 gzip 格式。

标签: java http encoding


【解决方案1】:

您应该使用content-encoding 标头作为end to end compression

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

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

【讨论】:

  • 好吧,我认为将gzip 放在哪个字段中并不重要,因为它在这里被列为注册传输编码:iana.org/assignments/http-parameters/http-parameters.xhtml 但是规范是否说它不允许压缩使用传输编码?
  • Transfer-Encoding 用于节点到节点的编码,您需要端到端的编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2012-12-02
  • 2011-12-06
  • 2018-05-03
  • 2017-06-30
  • 2011-03-27
  • 2023-03-16
相关资源
最近更新 更多