2011-12-07 59 views
1

我正在用C編寫一個http客戶端使用libcurl。但是,當重新使用相同的句柄傳輸PUT後跟POST時,我遇到了一個奇怪的問題。下方的示例代碼:libcurl - POST後PUT問題

#include <curl/curl.h> 

void send_a_put(CURL *handle){ 
    curl_easy_setopt(handle, CURLOPT_UPLOAD, 1L); //PUT 
    curl_easy_setopt(handle, CURLOPT_INFILESIZE, 0L); 
    curl_easy_perform(handle);   
} 

void send_a_post(CURL *handle){ 
    curl_easy_setopt(handle, CURLOPT_POST, 1L); //POST 
    curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE, 0L);   
    curl_easy_perform(handle);   
} 

int main(void){ 
    CURL *handle = curl_easy_init(); 

    curl_easy_setopt(handle, CURLOPT_URL, "http://localhost:8888/"); 
    curl_easy_setopt(handle, CURLOPT_HTTPHEADER, 
        curl_slist_append(NULL, "Expect:")); 

    curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L); //for debug 

    send_a_put(handle); 
    send_a_post(handle); 

    curl_easy_cleanup(handle); 
    return 0; 
} 

的問題是,而不是發送一個PUT然後POST,它發送2個PUT S:

> PUT/HTTP/1.1 
Host: localhost:8888 
Accept: */* 
Content-Length: 0 

< HTTP/1.1 200 OK 
< Date: Wed, 07 Dec 2011 04:47:05 GMT 
< Server: Apache/2.0.63 (Unix) PHP/5.3.2 DAV/2 
< Content-Length: 0 
< Content-Type: text/html 

> PUT/HTTP/1.1 
Host: localhost:8888 
Accept: */* 
Content-Length: 0 

< HTTP/1.1 200 OK 
< Date: Wed, 07 Dec 2011 04:47:05 GMT 
< Server: Apache/2.0.63 (Unix) PHP/5.3.2 DAV/2 
< Content-Length: 0 
< Content-Type: text/html 

更改順序使得正確地發生兩個傳輸(即send_a_post()然後send_a_put())。如果我在PUT之後或POST之後發送GET,一切都會正常。該問題僅在PUT後跟POST時發生。

有誰知道它爲什麼會發生?

回答

1

「如果您發出POST請求,然後想要使用相同的重用句柄創建HEAD或GET,則必須使用CURLOPT_NOBODY或CURLOPT_HTTPGET或類似方法顯式設置新的請求類型。」

the documentation

編輯:它實際上比這更簡單。您需要重置您的選項,如下所示:

void 
send_a_put (CURL * handle) 
{ 
    curl_easy_setopt (handle, CURLOPT_POST, 0L); // disable POST 
    curl_easy_setopt (handle, CURLOPT_UPLOAD, 1L); // enable PUT 
    curl_easy_setopt (handle, CURLOPT_INFILESIZE, 0L); 
    curl_easy_perform (handle); 
} 

void 
send_a_post (CURL * handle) 
{ 
    curl_easy_setopt (handle, CURLOPT_UPLOAD, 0L); // disable PUT 
    curl_easy_setopt (handle, CURLOPT_POST, 1L); // enable POST 
    curl_easy_setopt (handle, CURLOPT_POSTFIELDSIZE, 0L); 
    curl_easy_perform (handle); 
} 
+0

是的,我知道它。問題不在於'GET'或'HEAD'方法,而是在發送'PUT'後跟一個'POST'。 – tcurvelo

+0

這與我所描述的行爲是一樣的......你只需要設置正確的選項。 –

+0

對於libcurl,設置'CURLOPT_NOBODY'表示'HEAD','CURLOPT_HTTPGET'表示'GET'。好?在我展示的代碼中,我已經在'send_a_post()'函數中將新的請求類型設置爲'CURLOPT_POST'。 – tcurvelo