curl只能抓取頁面的部份內容的緣由



核心提示:先列出 HessianPHP 的錯誤提示: CURL transport error: transfer closed with outstanding read data remaining 基礎知識背景: 1)「Expect: 100-continue」的前因後果: HTTP/1.1 協議裏設計100 (Continue) HTTP 狀態碼的的目的是,在客 ...      php

先列出 HessianPHP 的錯誤提示:jquery

CURL transport error: transfer closed with outstanding read data remainingweb


基礎知識背景: 服務器

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 的要求是:app

若是 client 預期等待「100-continue」的應答,那麼它發的請求必須包含一個 " Expect: 100-continue" 的頭域!

2)libcurl 發送大於1024字節數據時啓用「Expect:100-continue‘特性:curl

 這也就是 Laruence 在 2011 年撰文所寫的:  內容來自17jquery url

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

一塊兒jquery,17jquery spa

zxgfa 在 2012年補充說:設計

第一,libcurl 在發送大於 1024 字節的 POST 請求時採用了這種方法,可是相對的,它會引發請求延遲的加大。 第二,並非全部的 web server 都能正確處理並應答「100-continue」,好比 lighttpd,就會返回417」 Expectation Failed 「,形成請求邏輯出錯。(鄭昀注1:lighttpd 1.4 版本有此嚴重問題,於1.5版本修復。 鄭昀注2:Resin 於 3.0.5 版本增長了對 Expect: 100-continue 的支持。)

3)PHP Curl-library 能夠主動封禁此特性:  有人在PHP手冊::curl_setopt下留言說:  PHP curl 聽從 libcurl 的特性。因爲不是全部 web servers 都支持這個特性,因此會產生各類各樣的錯誤。若是你遇到了,能夠用下面的命令封禁"Expect"頭域: <?phpcode

curl_setopt($ch,CURLOPT_HTTPHEADER, array('Expect:'));
?>
 pooy示範代碼以下所示:

內容來自17jquery

圖1 You can convince PHP's curl backend to stop doing the 100-continue-thing by setting an explicit request header


其餘知識背景:

  • 根據HessianTransport 代碼所述,」Hessian request using the CURL library「。


問題現象:

通訊協議是 Hessian。 調用接口時所傳參數在某種極端條件下, POST 的數據長度超過 1024 字節,hessian 報錯「CURL transport error: transfer closed with outstanding read data remaining」。

解決:修改hessian中 CURLOPT 項: CURLOPT_HTTPHEADER => array("Content-Type: application/binary") 改成 CURLOPT_HTTPHEADER => array("Content-Type: application/binary","Expect:")

相關文章
相關標籤/搜索