
在追蹤請求時發現了這么一個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:'));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/83290.html
標籤:PHP
上一篇:回看的,第八課——2,建構式篇
