[HTTP]HTTP/1.1 协议Expect: 100-continue
在追踪请求时发现了这么一个http头
基础知识背景:
1)“Expect: 100-continue”的来龙去脉:
HTTP/1.1 协议里设计 100 (Continue) HTTP 状态码的的目的是,在客户端发送 Request Message 之前,HTTP/1.1 协议允许客户端先判定服务器是否愿意接受客户端发来的消息主体(基于 Request Headers)。
即, Client 和 Server 在 Post (较大)数据之前,允许双方“握手”,如果匹配上了,Client 才开始发送(较大)数据。
这么做的原因是,如果客户端直接发送请求数据,但是服务器又将该请求拒绝的话,这种行为将带来很大的资源开销。
协议对 HTTP/1.1 clients 的要求是:
如果 client 预期等待“100-continue”的应答,那么它发的请求必须包含一个 " Expect: 100-continue" 的头域!
2)libcurl 发送大于1024字节数据时启用“Expect:100-continue‘特性:
这也就是 Laruence 在 2011 年撰文所写的:
在使用 curl 做 POST 的时候,当要 POST 的数据大于 1024 字节的时候,curl 并不会直接就发起 POST 请求,而是会分为两步:
1. 发送一个请求,包含一个 "Expect: 100-continue" 头域,询问 Server 是否愿意接收数据;
2. 接收到 Server 返回的 100-continue 应答以后,才把数据 POST 给 Server;
这是 libcurl 的行为。
于是,这样就有了一个问题, 并不是所有的Server都会正确应答100-continue, 比如lighttpd, 就会返回417 “Expectation Failed”, 则会造成逻辑出错,,
要解决的办法也挺容易:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
相关文章
- [日常] 华为手机截屏快捷键
- [windows] win10下的SysMain服务
- [nginx] X-Cache: HIT的意思
- [MySQL] 解决ERROR 1273 (HY000) at line 199: Unknown collation: 'utf8mb4_0900_ai_ci'
- [css] 加载本地文件出现跨域Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https.
- [html] link 标签 rel=canonical 属性的用法
- [windows] win10刷新dns的方法
- [windows] win10系统hosts文件的位置
- [Nginx] nginx屏蔽某个url和指定参数访问
- [PHP] 解决宝塔部署报错Warning: require(): open_basedir restriction in effect
- [PHP] php 7.4 Array and string offset access syntax with curly braces is deprecated
- [日常]华为手机允许APP应用后台保持运行,并显示通知
- Redis中scan命令实战
- [Nginx] 博客园出现了502错误该怎么追查原因
- [MySQL] myisam比innodb查询过程效率探究
- [MySQL]myisam表的索引结构以及查询过程
- [MySQL] innodb表为varchar字段建立索引后的查询过程
- [MySQL] 联合索引最左前缀原则的原因
- [日常] 浏览器前进后退与数据结构的思想
- [PHP] 判断两个数组是否相同