HTTP 100 Continue 状态码处理

100 Continue状态码的目的是对这样的情况进行优化:HTTP客户端应用程序有一个实体的主体部分要发送给服务器,但希望在发送之前查看一下服务器是否会接受这个实体。这可能会给编码带来一些困恼,因此这里进行详细讲解(它如何与客户端、服务器和代理进行通信)。

  1. 客户端与100 Continue
    如果客户端在向服务器发送一个实体,并且愿意在发送实体之前等待100 Continue响应,那么,客户端就要发送一个携带值为100 Continue Expect 首部,因为这样会使服务器误以为客户端要发发送一个实体。从很多方面来看,100 Continue都是一种优化。客户端应用程序只有在避免向服务器发送一个服务器无法处理或使用的大实体时,才应该使用100 Continue。
    由于期初对100 Continue状态存在一些困惑,因此发送了值为100 Continue的Expect首部的客户端不应该永远在那儿等待服务器发送100 Continue响应。超时一定时间之后,客户端应该直接将实体发送出去。

  2. 服务器与100 Continue
    如果服务器收到了一条带有值为100 Continue的Expect首部的请求,它会用100 Continue响应或一条错误码来进行响应。服务器永远也不应该向没有发送100 Continue期望的客户端发送 100 Continue状态码 (有些出错的服务器可能会这么做)。如果出于某种原因,服务器在优机会发送 100 Continue响应之前就收到了部分或全部的实体,就说明客户端已经决定继续发送数据了,这样,服务器就不需要发送这个状态码了。服务器读完请求之后,还是应该为请求发送一个最终状态码 (它可以跳过100 Continue状态)。
    最后,如果服务器收到带有 100 Continue 期望的请求,而且它决定在读取实体的主体部分结束请求,就不应该仅仅是发送一条响应并关闭连接,因为这样会妨碍客户端接收响应。

  3. 代理与100 Continue
    如果代理从客户端收到了一条带有 100 Continue 期望的请求,它需要做几件事情。如果代理知道目标服务器是HTTP/1.1兼容的,或者并不知道目标服务器与哪个版本兼容,它都应该将Expect首部发在请求中向下转发。如果它知道目标服务器只能与HTTP/1.1之前的版本兼容,就应该以417 Expectation Failed 错误进行响应。

问题处理:
PHP cURL方式发送请求到服务器,数据超过1k,有些服务器就会返回 100 Continue ,解决方法在cURL Header中添加 Expect:'' 的首部为空,这样服务器就会直接接收请求的实体了。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Ethan Smart & AI Algorithm
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

什么情况下发送1K这么大的数据

6年前 评论

:+1: 今天遇到这个问题了, 多谢

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!