28

我正在为透明代理编写 HTTP 解析器。让我难过的是Trailer:规格中提到的Transfer-Encoding: chunked. 它是什么样子的?

通常,HTTP 分块以这样的方式结束。

0\r\n
\r\n

我感到困惑的是,如果有某种尾随标头,如何检测块的结尾......

更新:我相信一个简单\r\n\r\n空行就足以检测到尾随标题的结尾......对吗?

4

3 回答 3

17

下面是我从TCP/IP 指南站点复制的示例预告片的副本。 拖车样本

如我们所见,如果我们想使用预告片头,我们需要添加一个带有头名的“Trailer:header_name”头字段,然后在分块正文区域之后添加预告片头实体。

我们可以根据 RFC 在 HTTP 正文中添加 0 个或多个尾部标头。RFC7230的第 4.1.2 节禁止在尾部标头区域中使用以下标头:

发送方不得生成包含消息帧(例如,传输编码和内容长度)、路由(例如,主机)、请求修饰符(例如,RFC7231第 5 节中的控件和条件)、身份验证所需的字段的尾部(例如,参见 RFC7235RFC6265)、响应控制数据(例如,参见RFC7231的第 7.1 节),或确定如何处理有效负载(例如,Content-Encoding、Content-Type、Content-Range 和 Trailer)。

这意味着我们可以在尾部标题区域中使用其他标准标题和自定义标题。

于 2014-07-21T10:28:06.413 回答
16

关于预告片:

如您所述,应在 Trailer 标头中指定尾随标头列表。

RFC 2616 第 14.40 节中的 BNF是这样的:

Trailer  = "Trailer" ":" 1#field-name

Gourley 和 Totty 举了这个例子:

Trailer: Content-Length

(他们给出这个例子很奇怪,因为 Content-Length 在 14.40 中被明确禁止作为尾随标头。)

Shiflett 给出了这个例子:

Trailer: Date

关于带有尾随标题的消息结尾:

RFC 2616 第 3.6.1 节中的 BNF就是您要查找的内容。这是部分:

Chunked-Body = *chunk
               last-chunk
               trailer
               CRLF
last-chunk   = 1*("0") [ chunk-extension ] CRLF
trailer      = *(entity-header CRLF)

所以最后一个块和 2 个尾随标头可能如下所示:

0<CRLF>
Date:Sun, 06 Nov 1994 08:49:37 GMT<CRLF>
Content-MD5:1B2M2Y8AsgTpgAmY7PhCfg==<CRLF>
<CRLF>
于 2012-07-03T14:36:01.347 回答
15

0\r\n
SomeAfterHeader: 数据\r\n
\r\n

换句话说,\r\n\r\n用外行的话来说,寻找一个就足够了:一个空白行。检测分块传输的结束。但在执行此操作之前读取每个块非常重要。因为分块数据本身可能包含空行,这些空行会被错误地检测为流的结尾。

于 2011-04-15T09:41:18.110 回答