空的“期望:”标题是不是意味着啥?

Posted

技术标签:

【中文标题】空的“期望:”标题是不是意味着啥?【英文标题】:Does empty "Expect:" header mean anything?空的“期望:”标题是否意味着什么? 【发布时间】:2013-01-05 18:01:38 【问题描述】:

默认情况下,许多库在所有 HTTP 1.1 POST 和 PUT 请求中都包含 Expect: 100-continue

我打算通过在客户端移除 100-continue 机制来减少感知延迟,因为我知道立即发送数据的费用低于等待往返 100-continue 的费用,即短请求。

当然,我仍然想要 HTTP 1.1 的所有其他强大功能,因此我只想杀死 Expect: 100-continue 标头。我有两个选择:

完全删除期望标头,或 发送空期望头,Expect:\r\n

这两者有什么区别吗?

任何软件可能会因其中一个或另一个而损坏?

【问题讨论】:

【参考方案1】:

如果您删除 Expect 标头,应该不会中断,但我知道 Microsoft IIS 过去曾遇到过 100 Continue 的问题。例如,IIS5 always sends 100 continue responses。所以,我想知道它在库中的至少一些用途是否可以解决服务器中类似的损坏行为。

许多库似乎设置了此标头,然后实际上并没有正确处理 100 Continue - 例如他们立即开始发送请求正文而不等待100 Continue 然后不处理服务器可能在他们完成发送请求正文之前发送回任何 HTTP 错误代码的事实(第一部分没关系,它是第二部分已损坏 - 请参阅我的回答稍后)。这让我相信有些作者只是从别处复制它而没有完全理解the subtleties。

我看不出包含空白 Expect 标头的任何理由 - 如果您不打算包含 100-continue(或其他一些 Expect 子句),则完全省略标头。包含它的唯一原因是解决损坏的网络服务器,但我不知道有任何以这种方式运行。

最后,如果您只是想减少往返延迟,在我看来,立即开始传输请求正文实际上并不会与 RFC不一致。您不应该无限期地等待发送请求正文(根据the RFC),因此您的行为符合规范 - 只是您在发送之前的超时时间为零。

您必须知道,如果服务器已经收到一些请求正文,则服务器可以不发送 100 Continue 响应,因此您必须处理发送 100 Continue 的服务器,那些什么都不发送并等待的服务器对于完整请求和立即发送任何 HTTP 错误代码(可能是 417,但更可能是通用 4xx 代码)的请求。这样,您的短请求不应该有任何开销(除了Expect 标头),但您不必等待100 Continue。当然,要使这种方法发挥作用,您需要以一种允许您在服务器返回错误代码时立即中断请求的方式进行处理(例如,带有poll()select() 的非阻塞IO)。

以这种方式做事可能有助于使您的代码在大小请求之间更加一致,同时减少延迟。缺点是它可能不是 RFC 作者的想法,即使它没有明确违反任何要求。此外,如果您尚未进行非阻塞 IO 或类似操作,它可能会使您以后的代码更加复杂。

【讨论】:

以上是关于空的“期望:”标题是不是意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章

未处理的拒绝(错误):期望不可为空的变量的值:类型的时间:时间!在变量值中

外观总是通过测试,不管我期望啥回报

Oracle/Toad 期望啥日期格式?

javacv 中的 cvFitEllipse2 期望啥数据?

NestJS/swagger:ApiExtraModel 期望啥模型作为参数?

无法理解 Sailsjs 期望啥创建适配器