2013-11-22 2 views
0

Когда я пытаюсь выполнить HTTP_POST, HTTP_DELETE операцию с недоступным сервером, код возврата иногда приходит как -1. Из-за этого мое приложение терпит крах.curl_easy_perform возвращает -1, когда сервер недоступен

Вот мой пример кода.

Мой код приложения находится в C++, где я также читаю заголовок ответа и ответа.

lCode = curl_easy_setopt(curlHandle, CURLOPT_HEADERFUNCTION, 
             HttpClientImplCurl::recvFunctionHeader); 

    if (lCode != CURLE_OK) { 
     LOG(LOG_CRIT, "CURL failure: curl_easy_setopt CURLOPT_HEADERFUNCTION returned %d\n", lCode); 
     curl_slist_free_all(lHeaders); 
     errorBuff = curl_easy_strerror(lCode); 
     return http_code; 

    } 


    lCode = curl_easy_setopt(curlHandle, CURLOPT_WRITEHEADER, 
             &readResHeaderBuffer); 

    if (lCode != CURLE_OK) { 
     LOG(LOG_CRIT, "CURL failure: curl_easy_setopt CURLOPT_WRITEHEADER returned %d\n", lCode); 
     curl_slist_free_all(lHeaders); 
     errorBuff = curl_easy_strerror(lCode); 
     return http_code; 

    } 

     lCode = curl_easy_setopt(curlHandle, CURLOPT_WRITEFUNCTION, 
          HttpClientImplCurl::recvFunction); 

    if (lCode != CURLE_OK) { 
     LOG(LOG_CRIT, "CURL failure: curl_easy_setopt WRITEFUNCTION returned %d\n", lCode); 
     curl_slist_free_all(lHeaders); 
     errorBuff = curl_easy_strerror(lCode); 
     return http_code; 

    } 

    lCode = curl_easy_setopt(curlHandle, CURLOPT_WRITEDATA, 
          &readResBuffer); 

    if (lCode != CURLE_OK) { 
     LOG(LOG_CRIT, "CURL failure: curl_easy_setopt WRITEDATA returned %d\n", lCode); 
     curl_slist_free_all(lHeaders); 
     errorBuff = curl_easy_strerror(lCode); 
     return http_code; 

    } 

    lCode = curl_easy_setopt(curlHandle, CURLOPT_CUSTOMREQUEST, "DELETE"); /* !!! */ 

    if (lCode != CURLE_OK) { 
     LOG(LOG_CRIT, "CURL failure: curl_easy_setopt CURLOPT_CUSTOMREQUEST returned %d\n", lCode); 
     curl_slist_free_all(lHeaders); 
     errorBuff = curl_easy_strerror(lCode); 
     return http_code; 

    } 

    lCode = curl_easy_setopt(curlHandle, CURLOPT_POSTFIELDS, aInRemovedata.getBuffer()); /* data goes here */ 

    if (lCode != CURLE_OK) { 
     LOG(LOG_CRIT, "CURL failure: curl_easy_setopt CURLOPT_POSTFIELDS returned %d\n", lCode); 
     curl_slist_free_all(lHeaders); 
     errorBuff = curl_easy_strerror(lCode); 
     return http_code; 

    } 

lCode = curl_easy_perform(curlHandle); 


    if (lCode != CURLE_OK) { 
     LOG(LOG_CRIT, "CURL failure: curl_easy_perform returned %d\n", lCode); 
     curl_slist_free_all(lHeaders); 
     errorBuff = curl_easy_strerror(lCode);---->my doubt is when i am geting "-1", this line is caused the crash. 
     return http_code; 
    } 

И мой обратный вызов следующим образом,

size_t 
HttpClientImplCurl::recvFunctionHeader(void *aInBuf, size_t aInSize, 
           size_t aInNmemb, void* aInUserp) 
{ 
    fprintf(stderr, "curl error: too small buffer in recv2\n"); 
    ((std::string*)aInUserp)->append((char*)aInBuf, aInSize * aInNmemb); 
    return aInSize * aInNmemb; 
} 


// Private static callback 
size_t 
HttpClientImplCurl::recvFunction(void *aInBuf, size_t aInSize, 
           size_t aInNmemb, void* aInUserp) 
{ 
    fprintf(stderr, "curl error: too small buffer in recv1\n"); 
    ((std::string*)aInUserp)->append((char*)aInBuf, aInSize * aInNmemb); 
    return aInSize * aInNmemb; 
} 

Пожалуйста, помогите мне в этом, почему мы получаем иногда «-1» вместо «28».

Вот функция подписи, где errorBuf подходит в качестве параметра

int 
HttpClientImplCurl::put(const HttpClient& aInClient,const base::Buffer& aInPutdata, 
          base::Buffer& aOutRecvBuf,base::Buffer& aOutRecvHeaderBuf,const char*& errorBuff) 
+0

Как определяется 'errorBuff'? – alk

ответ

0

Вы можете попробовать установить CURLOPT_ERRORBUFFER и CURLOPT_VERBOSE, чтобы получить больше информации о том, почему значение, возвращаемое curl_easy_perform -1.

Смежные вопросы