Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTTP分块编码。需要一个';拖车';在规范中提到_Http_Chunked Encoding_Chunking_Http Chunked - Fatal编程技术网

HTTP分块编码。需要一个';拖车';在规范中提到

HTTP分块编码。需要一个';拖车';在规范中提到,http,chunked-encoding,chunking,http-chunked,Http,Chunked Encoding,Chunking,Http Chunked,我正在为透明代理编写HTTP解析器。困扰我的是传输编码:chunked规范中提到的预告片:。它看起来像什么 通常,HTTP分块的结果是这样的 0\r\n \r\n 我所困惑的是,如果存在某种尾随标头,如何检测块的结尾 更新:我认为一个简单的\r\n\r\n即一个空行就足以检测尾部标题的结尾。。。对吗 0\r\n SomeAfter标题:数据\r\n \r\n 换句话说,用外行的话说,只需查找一个\r\n\r\n,一个空行就足够了。检测分块传输的结束。但在执行此操作之前读取每个块是非常重要的。因

我正在为透明代理编写HTTP解析器。困扰我的是
传输编码:chunked
规范中提到的
预告片:
。它看起来像什么

通常,HTTP分块的结果是这样的

0\r\n
\r\n
我所困惑的是,如果存在某种尾随标头,如何检测块的结尾

更新:我认为一个简单的
\r\n\r\n
即一个空行就足以检测尾部标题的结尾。。。对吗

0\r\n
SomeAfter标题:数据\r\n
\r\n


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

关于尾部:

正如您所注意到的,尾部标题列表应在尾部标题中指定

BNF是这样的:

古利和托蒂举了一个例子:

Trailer: Content-Length
Trailer: Date
(奇怪的是,他们给出了这个例子,因为在14.40中,内容长度被明确禁止作为尾部标题。)

Shiflett举了一个例子:

Trailer: Content-Length
Trailer: Date
关于带有尾部标题的邮件结尾:

你要找的就是BNF。以下是部分内容:

Chunked-Body = *chunk
               last-chunk
               trailer
               CRLF
last-chunk   = 1*("0") [ chunk-extension ] CRLF
trailer      = *(entity-header CRLF)
因此,最后一个区块和两个尾随标头可能如下所示:

0<CRLF>
Date:Sun, 06 Nov 1994 08:49:37 GMT<CRLF>
Content-MD5:1B2M2Y8AsgTpgAmY7PhCfg==<CRLF>
<CRLF>
0
日期:1994年11月6日星期日08:49:37 GMT
内容-MD5:1B2M2Y8AsgTpgAmY7PhCfg==

下面是我从中复制的示例拖车的副本。

正如我们所看到的,如果我们想使用拖车头,我们需要添加一个带有头名称的“拖车:头\名称”头字段,然后在分块体区域后添加拖车头实体

我们可以在每个RFC的HTTP正文中添加0个或多个拖车头。 第4.1.2节禁止在拖车收割台区域使用以下收割台:

发件人不得生成包含必需字段的尾部 对于消息帧(例如,传输编码和内容长度), 路由(如主机)、请求修改器(如控件和 第5节中的条件),身份验证(例如,参见 和),响应控制数据(例如,见第7.1节 或确定如何处理有效载荷(例如。, 内容编码、内容类型、内容范围和预告片)


这意味着我们可以在拖车标题区使用其他标准标题和自定义标题。

感谢您发布此消息,我也在想同样的事情。让我恼火的是,0长度块在零长度数据之后没有自己的\r\n块。现在很清楚,我再次重读了RFC,但很高兴看到一个清晰的例子,它是如何与一些标题看起来。。。希望他们能在RFC里加上这个所以。。。如何从Gzip编码的流中检测分块部分?@Alexsandro_xpt-消息体首先被压缩,然后被分块,这样您就可以在不解压缩任何内容的情况下解码分块编码。没错,但你真的应该引用RFC 7230。谢谢你的评论,朱利安。我刚刚浏览了RFC 7230并更新了我的引文。对于chunked和trailer部分,它更清晰。这是一个很好的例子,但它的chunks长度值是错误的。固定块:
28您请求的文件长度为
21个字节,最后一次修改:
“…用外行的话说,查找一个\r\n\r\n就足够了:一个空行。检测块传输的结束。”这对我来说似乎是错误的。非常清楚:您应该根据区块大小读取区块数据;当您找到0块大小时,您已找到最后一个块。你的其余答案很好,但我认为你应该修正这句话。@unixman83:如果你的答案不正确(正如霍克维·帕克所指出的),你应该要么改正它,要么取消将其标记为已接受的答案。不要误导用户。许多人,包括我在内,认为如此的答案是理所当然的,没有阅读所有的评论,因为它通常是值得信赖的。这似乎是一个“例外”,游客应该“抓住”!!为什么人们给出的例子仅仅是简单的例子????如果拖车中有多个标题,您会怎么做?你使用逗号分隔的列表还是什么?为什么人们不为自己阅读规范而烦恼呢????你问题的答案已经在我的答案里了。想要线索吗?这是1#field。要再来一杯吗?到这里:。