libcurl - POST после выпуска PUT - PullRequest
1 голос
/ 07 декабря 2011

Я пишу http-клиент на C, используя libcurl. Однако я сталкиваюсь со странной проблемой, когда повторно использую тот же дескриптор для передачи PUT, за которым следует POST. Пример кода ниже:

#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()). Все идет хорошо, даже если я отправляю GET после PUT или до POST. Проблема возникает только с PUT, за которым следует POST.

Кто-нибудь знает, почему это происходит?

1 Ответ

1 голос
/ 07 декабря 2011

"Если вы отправляете запрос POST, а затем хотите создать HEAD или GET, используя тот же повторно используемый дескриптор, вы должны явно установить новый тип запроса, используя CURLOPT_NOBODY или CURLOPT_HTTPGET или подобное."

С документация

РЕДАКТИРОВАТЬ: на самом деле это даже проще, чем это. вам нужно сбросить настройки между вызовами, как это:

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);
}
...