HTTP Chunked编码.需要一个SPEC中提到的"预告片"的例子

uni*_*n83 25 http chunking chunked-encoding http-chunked

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

通常,HTTP chunked会像这样结束.

0\r\n
\r\n
Run Code Online (Sandbox Code Playgroud)

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

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

app*_*eaf 16

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

我们可以看到,如果我们想要使用预告片头,我们需要添加一个带有标题名称的"Trailer:header_name"标题字段,然后在分块的正文区域之后添加预告片标题实体.

我们可以根据RFC在HTTP正文中添加0个或更多个预告片头.RFC7230的 4.1.2节禁止在预告片标题区域中使用以下标头:

发送方不得生成包含消息成帧所需字段(例如,传输编码和内容长度),路由(例如,主机),请求修饰符(例如RFC7231第5节中的控制和条件),认证的预告片(例如,参见 RFC7235RFC6265),响应控制数据(例如,参见RFC7231的第7.1节),或确定如何处理有效载荷(例如,内容编码,内容类型,内容范围和预告片).

这意味着我们可以在预告片标题区域中使用其他标准标头和自定义标头.

  • 没错,但你真的应该引用RFC 7230. (3认同)

uni*_*n83 15

0\r \n
SomeAfterHeader:TheData \ r \n
\ r \n

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

  • "......用外行的术语来寻找一个\ r \n\r \n就足够了:a*空行*.用于检测分块传输的结束." 这对我来说似乎不对.[ABNF](http://tools.ietf.org/html/rfc7230#section-4.1)非常明确:你应该根据chunk-size读取块数据; 当你发现找到0块大小时,你就找到了最后一块.你的答案非常好,但我认为你应该解决这个问题. (7认同)
  • @ unixman83:如果您的回答不正确(如Hawkeye Parker所示),您应该更正或者将其标记为已接受的答案.不要误导SO用户.许多人,包括我在内,都认为SO答案是理所当然的,而不是阅读所有评论,因为它通常是值得信赖的.这似乎是一个"例外",游客应该"赶上"!! (2认同)

jam*_*iss 15

关于预告片:

如您所述,应在"预告片"标题中指定尾随标题列表.

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

Trailer  = "Trailer" ":" 1#field-name
Run Code Online (Sandbox Code Playgroud)

Gourley和Totty给出了这个例子:

Trailer: Content-Length
Run Code Online (Sandbox Code Playgroud)

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

Shiflett给出了这个例子:

Trailer: Date
Run Code Online (Sandbox Code Playgroud)

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

RFC 2616的3.6.1节中的BNF 是您正在寻找的.这是部分:

Chunked-Body = *chunk
               last-chunk
               trailer
               CRLF
last-chunk   = 1*("0") [ chunk-extension ] CRLF
trailer      = *(entity-header CRLF)
Run Code Online (Sandbox Code Playgroud)

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

0<CRLF>
Date:Sun, 06 Nov 1994 08:49:37 GMT<CRLF>
Content-MD5:1B2M2Y8AsgTpgAmY7PhCfg==<CRLF>
<CRLF>
Run Code Online (Sandbox Code Playgroud)

  • 为什么人们不打扰自己阅读规范???? 你的问题的答案已经在我的答案中.想知道吗?它是1#字段.想要另一个?请访问:http://tools.ietf.org/html/rfc2616#section-2.1. (5认同)
  • 到底为什么人们给出的例子只能说明简单的情况???如果预告片中有多个标题怎么办?您使用逗号分隔列表还是什么? (2认同)