curl時にExpectを設定する必要性
1978 ワード
原文:https://www.fanhaobai.com/2017/08/curl-expect-continue.html
Curlは、内部インタフェース、サードパーティapi、ピクチャストレージサービスなど、プロジェクトで使用頻度が高いが、curlを使用する場合、Expectというリクエストヘッダ情報に気づかない可能性があり、Expectの設定が正しくないと、不要なHTTPリクエストが発生し、ビジネスロジックエラーを引き起こす可能性がある.
に質問
EXectヘッダ情報を設定せずにcurlを使用してPOST要求を送信する場合、POSTデータが1 kbより大きい場合、curlのデフォルト動作は以下の通りである.まず サーバから返された応答ヘッダ情報に
tcpdumpツールでcurlクライアントネットワークリクエストをキャプチャします.HTTP要求応答ヘッダ及びデータを表示する:
要求情報内容:
応答情報:
この場合,curlは不要なHTTP要求を送信し,システム性能上許されない.また、すべてのサーバが
解決策
いくつかのオープンソースクラスライブラリ(guzzle、qqサードパーティapiですがsolariumではサポートされていません)を確認すると、curlでこの問題に気づき、解決していることがわかります.Expectリクエストヘッダを空に設定するだけでいいです.
再度tcpdumpがパケットをキャプチャすると,curlを用いて1 kbを超えるPOSTデータを送信した場合でも,100−continueのHTTP要求は現れなかった.
Curlは、内部インタフェース、サードパーティapi、ピクチャストレージサービスなど、プロジェクトで使用頻度が高いが、curlを使用する場合、Expectというリクエストヘッダ情報に気づかない可能性があり、Expectの設定が正しくないと、不要なHTTPリクエストが発生し、ビジネスロジックエラーを引き起こす可能性がある.
に質問
EXectヘッダ情報を設定せずにcurlを使用してPOST要求を送信する場合、POSTデータが1 kbより大きい場合、curlのデフォルト動作は以下の通りである.
Expect: 100-continue
要求ヘッダ情報を追加し、このPOSTデータを含まない要求を送信する.Expect: 100-continue
が含まれている場合は、サーバがデータを受け入れたいことを示し、POSTがサーバに本当のデータを与える.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.....@[email protected].
......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要求を送信し,システム性能上許されない.また、すべてのサーバが
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を用いて1 kbを超えるPOSTデータを送信した場合でも,100−continueのHTTP要求は現れなかった.