31

HTTP/1.1指定发送的响应Transfer-Encoding: chunked可以包含可选的尾部(即通常作为头部发送的内容,但由于某种原因不能在内容之前计算,因此它们可以附加到末尾),例如:

要求:

GET /trailers.html HTTP/1.1
TE: chunked, trailers

回复:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Trailer: My-Test-Trailer
D\r\n
All your base\r\n
B\r\n;
 are belong\r\n
6\r\n
 to us\r\n
0\r\n
My-Test-Trailer: something\r\n
\r\n

此请求在TE标头中指定它期待chunked响应,并将trailers在最终块之后寻找。

响应在Trailer标题中指定它将发送的预告片列表(在这种情况下,只有一个My-Test-Trailer:)

每个块被发送为:

  • 十六进制的块大小(D= 13),后跟一个CRLF
  • 块数据 ( All your base),后跟一个CRLF

零大小的块 ( 0\r\n) 表示正文的结尾。

然后指定预告片 ( My-Test-Trailer: something\r\n),然后是 final CRLF

现在,从我目前所读的所有内容来看,很少(如果有的话)使用预告片。大多数关于预告片讨论通常以“但是你为什么要使用预告片?”开头。

抛开为什么的问题不谈,出于好奇,我一直在尝试模拟使用预告片的 HTTP 请求/响应交换;但到目前为止,我还不能让它工作,而且我不确定我生成的响应是否有问题,或者(正如一些人建议的那样)根本没有客户端在寻找尾随标头.

我尝试过的客户端包括:curl、wfetch、Chrome + jQuery。

在所有情况下,客户端都会接收并正确重建分块响应(All your base are belong to us);我可以在Trailer: My-Test-Trailer正在发送的响应标头中看到;但我My-Test-Trailier: something在响应标头或任何地方都没有看到返回。在收到整个响应并关闭连接之后,不清楚这样的尾随标头是否应该作为正常的响应标头出现在客户端中?

有趣的是,curl 更改日志似乎表明 curl确实支持可选的预告片,并且 curl 会将它找到的任何预告片处理到正常的标头流中

所以有人知道吗:

  • 我可以 ping 的有效 URL,它在分块响应中发送预告片?(以便我可以确认是否只是我的测试响应不起作用);和
  • 已知哪些客户端支持(和访问/显示)服务器发送的预告片?
4

4 回答 4

11

没有常见的浏览器支持 HTTP/1.1 预告片。查看browserscope的“网络”选项卡中的“预告片中的标题”列。

  • Chrome:不,也不会修复(错误)。支持 H/2 拖车(错误)。
  • Firefox:没有,而且我在 bugzilla 中没有看到它的票证。似乎支持 H/2。
  • 即:没有
  • 边缘:没有
  • 野生动物园:没有
  • Opera:仅限旧版本(v10 - 12,在 14 中删除)

正如您所发现的,许多非浏览器客户端都支持它。

于 2016-08-16T00:16:46.693 回答
9

自提出这个问题以来已经超过 5 年了,我现在可以自己明确地回答它。

Mozilla 刚刚宣布他们将支持新Server-Timing字段作为 HTTP 尾随标头(他们首次支持预告片)。

https://bugzilla.mozilla.org/show_bug.cgi?id=1413999

然而,更重要的是,他们确认它将被列入白名单,因此这Server-Timing是唯一的支持值(强调我的):

Server-Timing 是 HTTP 预告片,而不是标头。:mcmanus 告诉我我们目前正在解析预告片,但随后默默地将它们丢弃。我们一般不想改变这种行为(我们不想鼓励预告片),所以我们想要将 Server-Timing 预告片列入白名单,将其存储在某个地方(可能现在即使只是一个 mServerTiming 标头也可以工作,因为它是我们支持的唯一预告片),然后通过一些新的 channel.getTrailers() 调用使其可用。

因此,我想这可以一劳永逸地证实:Moz 不支持尾随标头(并且永远不可能是一般意义上的),并且可能所有其他浏览器供应商都采取相同的立场。

于 2018-01-10T04:13:40.047 回答
3

自此提交以来,Jodd HTTP Java 客户端支持尾部标头。

在第一个问题上,我还没有找到任何使用它们的实时响应;)

于 2014-03-20T03:56:48.533 回答
0

就在最近,据caniuse.com称,大多数主要浏览器提供商现在都支持Trailer最新版本的响应标头(例如 Firefox-88、Safari-14.1、Chrome-88 等)。

但是,这似乎只是因为他们支持Server-Timing(可以使用另一个答案中提到的预告片),并且目前似乎没有从浏览器 Javascript 访问 Trailer 标头的通用方法 - 目前是Fetch API的一个未解决问题,Chrome 中预告片的错误请求被标记为 wontfix

于 2021-05-13T10:44:41.927 回答