美文网首页
curl时设置Expect的必要性

curl时设置Expect的必要性

作者: Howborn | 来源:发表于2017-08-26 12:31 被阅读0次

原文:https://www.fanhaobai.com/2017/08/curl-expect-continue.html

curl 在项目中使用频率较高,比如内部接口、第三方 api、图片存储服务等,但是我们在使用 curl 时可能并没有注意到 Expect 这个请求头信息,而 Expect 设置不正确,会导致不必要的一次 HTTP 请求,甚至可能会导致业务逻辑错误。

问题

在不设置 Expect 头信息使用 curl 发送 POST 请求时,如果 POST 数据大于 1kb,curl 默认行为 如下:

  1. 先追加一个Expect: 100-continue请求头信息,发送这个不包含 POST 数据的请求;
  2. 如果服务器返回的响应头信息中包含Expect: 100-continue,则表示 Server 愿意接受数据,这时才 POST 真正数据给 Server;

通过 tcpdump 工具抓包 curl 客户端网络请求。查看 HTTP 请求响应头以及数据:

$ tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

请求信息内容:

23:04:15.498902 IP bogon.35808 > 10.16.**.***.http: Flags [P.], seq 1749154338:1749154696, ack 673671676, win 14600, length 358
E.....@.@.8...U.
......PhA."('i.P.9.]Q..POST /* HTTP/1.1
User-Agent: GuzzleHttp/6.2.1 curl/7.19.7
Content-Type: application/json
Host: *.t.ziroom.com
Content-Length: 24343
Expect: 100-continue

响应信息:

23:04:15.499869 IP 10.16.**.***.http > bogon.35808: Flags [P.], seq 1:26, ack 358, win 64240, length 25
E..A......2.
.....U..P..('i.hA..P.......HTTP/1.1 100 Continue

可见此时,curl 发送了一次不必要的 HTTP 请求,从系统性能上来说这是不允许的。另外,并不是所有的 Server 都会正确响应100-continue,反而会返回417 Expectation Failed,curl 端不会发起数据 POST 请求,则会造成业务逻辑错误,我们应该避免这种情况的发生。

解决办法

如果查看过一些开源类库(guzzle、qq第三方api,不过 solarium 并未支持),你就会发现他们在 curl 时已经注意到并解决这个问题了,只需 设置 Expect 请求头为空 即可。

// qq第三方api
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));

// guzzle的curl Adapter
if (!$request->hasHeader('Expect')) {
    $conf[CURLOPT_HTTPHEADER][] = 'Expect:';
}

再次 tcpdump 抓包,发现使用 curl 发送超过 1kb 的 POST 数据时,也并未出现 100-continue 的 HTTP 请求。

相关文章

  • curl时设置Expect的必要性

    原文:https://www.fanhaobai.com/2017/08/curl-expect-continue...

  • PHP CURL请求

    Expect 在不设置 Expect 头信息使用 curl 发送 POST 请求时,如果 POST 数据大于 1k...

  • Curl Expect

    问题 使用Curl POST数据时,如果POST的数据大于1024字节,Curl并不会直接发起POST请求,而是分...

  • curl说明

    设置基本信息: curl_setopt(string);//设置curl的目录地址 curl_setopt(por...

  • Mac设置终端ssh自动登录

    Mac设置终端ssh自动登录 1. 安装expect 2. 编写expect登录脚本 输入 touch login...

  • PHP CURL

    php 中使用curl的一般步骤 curl_init() 初始化curl句柄 curl_setopt() 设置请求...

  • Debian Linux下增加php对curl扩展的支持

    使用php -m查看php当前已开启扩展库 原本在安装php时没有设置curl扩展库,最近项目需要curl扩展库的...

  • PHP小结大全

    CURL设置超时 curl普通秒级超时: curl普通秒级超时使用:复制代码代码如下: curl如果需要进行毫秒超...

  • 01-简单工厂模式

    简单工厂模式 (Simple Factory Pattern) 使用curl发送请求时,通常需要设置请求头信息U...

  • curl超时的设置

    网上这方面内容其实蛮多了,但是我还是要记录下我这里实际应用的心得体会 CURLOPT_CONNECTTIMEOUT...

网友评论

      本文标题:curl时设置Expect的必要性

      本文链接:https://www.haomeiwen.com/subject/rjvmdxtx.html