[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

在使用 curl 作 POST 的時候,當要 POST 的數據大於 1024 字節的時候,curl 並不會直接就發起 POST 請求,而是會分爲兩步:
1. 發送一個請求,包含一個 "Expect: 100-continue" 頭域,詢問 Server 是否願意接收數據;
2. 接收到 Server 返回的 100-continue 應答之後,才把數據 POST 給 Server;
這是 libcurl 的行爲。url

因而,這樣就有了一個問題, 並非全部的Server都會正確應答100-continue, 好比lighttpd, 就會返回417 「Expectation Failed」, 則會形成邏輯出錯,,
要解決的辦法也挺容易:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));設計

相關文章
相關標籤/搜索