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
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

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

6年前 评论

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

2年前 评论

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