HTTP库能否确定消息正文';在不了解请求方法的情况下的长度?

HTTP库能否确定消息正文';在不了解请求方法的情况下的长度?,http,protocols,network-protocols,Http,Protocols,Network Protocols,在HTTP请求/响应过程中,您如何确定消息正文的存在和长度,特别是,所需的算法是否使用请求方法作为输入? 不过,我对请求和响应都感兴趣 ,并且看起来它应该可以单独在头上确定(即,使用中指定的方法),这对请求有好处,但同样可以对响应执行相同的操作 似乎表明相同的算法应该用于请求和响应(因为它是用消息体的通用术语来描述的),因此这似乎表明它可以通用地完成 然而,在这里,内容的长度像一个酸痛的拇指一样突出:在响应期间,内容长度作为标题的一部分发送回来,但是没有正文 HEAD是特殊的,也是唯一的特殊方法

在HTTP请求/响应过程中,您如何确定消息正文的存在和长度,特别是,所需的算法是否使用请求方法作为输入?

不过,我对请求和响应都感兴趣 ,并且看起来它应该可以单独在头上确定(即,使用中指定的方法),这对请求有好处,但同样可以对响应执行相同的操作

似乎表明相同的算法应该用于请求和响应(因为它是用消息体的通用术语来描述的),因此这似乎表明它可以通用地完成

然而,在这里,内容的长度像一个酸痛的拇指一样突出:在响应期间,内容长度作为标题的一部分发送回来,但是没有正文


HEAD是特殊的,也是唯一的特殊方法吗?或者可以有类似的行为,因此我确实需要知道——对于每个方法——该方法是否需要特殊处理。(因此,除非在HTTP之外预先协商,否则不能使用扩展方法。)

TL;DR-否-HTTP库在不知道请求方法的情况下无法100%可靠地确定响应消息体的存在,这与规范关于使用相同算法处理请求和响应的另一点相矛盾

更新:正如@JulianReschke提到的,规范的这一部分已经重写。下面是我自己的实证证据,以进一步支持说明这一点

§4.4详细说明了确定真实“消息长度”的若干因素,并列出了响应类型(#1)的“优先级”高于
内容长度的值(#3)。特别是,它提到“对头部请求的任何响应”属于“不得”包含消息体的响应”。因此,即使服务器发送错误的头,客户端也应该知道根据响应类型忽略它。这一点似乎被严格遵守(如下所示),因此关于使用相同算法处理请求和响应的另一点似乎是不正确的

事实上,我尝试用不同的HEAD请求访问我自己的Apache服务器,在
内容长度
、vis-a-vis一致性以及如何处理请求方面得到了非常不同的结果。以下是我发送的请求和收到的回复的相关部分


请求
HEAD/

响应
200正常

内容长度:
1639

我的web根目录包含
index.html
,而
1639
是该文件的大小(以字节为单位)。这是不一致的。在这种情况下,它应该发送内容长度为
0
,因为无论文件大小,此响应本身都没有消息正文


请求
HEAD/someproject

响应
301永久移动

/someproject
是一个目录,Apache希望在请求URI的末尾看到一个斜杠,因此抛出301错误。显然,因为响应是一个错误,所以根本不发送内容长度,并且这种省略将被解释为
0
。这是一致的


请求
GET/someproject

响应
301永久移动

内容长度:
386

再次尝试使用
GET
而不是
HEAD
,现在我获得了Apache自动生成的错误页面的内容长度,以伴随301头。这是一致的,尽管考虑到它如何处理上述两个
HEAD
请求有点奇怪


请求
HEAD/someproject

接受编码:gzip,deflate

响应
301永久移动

内容长度:
20

返回
标题
,但请求Gzip响应。这次我得到了内容长度
20
,它是应用gzip编码后的空响应的大小。这个应该是一致的,但是没有发送实际的20字节gzip消息(可能是因为它是一个
请求)


请求
HEAD/someproject/

响应
200正常

该目录确实包含
index.php
,但与第一个返回
index.html
文件大小的示例不同,这里Apache不希望执行php脚本来找出实际响应的内容长度,因此它将其视为
0
。这与规范一致,因为没有发送任何消息体,但与第一个示例非常不一致,在第一个示例中它确实发送了一个值。客户机无法知道索引文件是HTML还是PHP,因此有时只发送一个值似乎很奇怪



因此,我同意该规范自相矛盾,显然,Apache也是如此。如果您正在设计一个HTTP库,我建议您使它尽可能健壮,以处理可能遇到的各种消息,即使它们不完全符合规范。

RFC2616已经过时。新规范中的描述已完全重写。请参阅。

不确定是否将此列为答案,但我最近通读了请求方法列表,我确实认为HEAD在这里很特别。鉴于HEAD的响应将包含内容长度,但没有正文,为什么您不认为这与§4.4中概述的方法冲突?