問題描述:
同一份libcurl post請求代碼,在ubuntu下可以正常執行,而在windows下,curl_easy_perform卻返回 52
curl_easy_strerror(52)返回: Server returned nothing (no headers, no data)
原因:
在windows下,libcurl自動添加了一個請求頭 Expect: 100-continue
HTTP/1.1 協議裏設計 100 (Continue) HTTP 狀態碼的的目的是,在客户端發送 Request Message 之前,HTTP/1.1 協議允許客户端先判定服務器是否願意接受客户端發來的消息主體(基於 Request Headers)。
即, 客户端 在 Post(較大)數據到服務端之前,允許雙方“握手”,如果匹配上了,Client 才開始發送(較大)數據。
這麼做的原因是,如果客户端直接發送請求數據,但是服務器又將該請求拒絕的話,這種行為將帶來很大的資源開銷。
如果 client 預期等待“100-continue”的應答,那麼它發的請求必須包含一個 " Expect: 100-continue" 的頭域!
libcurl自動添加的請求頭 Expect: 100-continue,會導致請求頭和請求體分開兩次發送。
但並不是所有的 Server 都會正確實現 100-continue 協議。
解決辦法:
在libcurl的post請求代碼中刪除請求頭 Expec 即可,確保請求頭和請求體一起發送