2014-08-11 1 views
0

Я пытаюсь сделать что-то быстро и грязно. Я увидел еще SO question и попытался повторно использовать код. Я нахожу пару сервисов отдыха (не многопотоковых), которые возвращают json, и когда он называется CURLOPT_WRITEFUNCTION, он вызывает ошибку seg. Я все еще пытаюсь понять все концепции C++, поэтому было довольно сложно диагностировать.C++ libcurl seg fault in write callback function

Вот что я вижу

static std::string *DownloadedResponse; 

static size_t writer(char *data, size_t size, size_t nmemb, std::string *buffer_in) 
{ 
    cout << "In writer callback" << endl; 

    // Is there anything in the buffer? 
    if (buffer_in != NULL) 
    { 
     cout << "Buffer not null" << endl; 
     // Append the data to the buffer 
     buffer_in->append(data, size * nmemb); 
     cout <<" Buffer appended, seting response" << endl; 

     DownloadedResponse = buffer_in; 
     cout << "Set downloadedResponse" << endl; 
     return size * nmemb; 
    } 

    return 0; 
} 

std::string downloadJSON(std::string URL) 
{ 
    CURL *curl; 
    CURLcode res; 
    struct curl_slist *headers=NULL; // init to NULL is important 
    std::ostringstream oss; 
    curl_slist_append(headers, "Accept: application/json"); 
    curl_slist_append(headers, "Content-Type: application/json"); 
    curl_slist_append(headers, "charsets: utf-8"); 
    curl = curl_easy_init(); 
    if (curl) 
    { 
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
     curl_easy_setopt(curl, CURLOPT_URL, URL.c_str()); 
     curl_easy_setopt(curl, CURLOPT_HTTPGET,1); 
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
     curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,writer); // I comment this to display response in stdout. 

     cout << "calling easy_perform" << endl; 
     res = curl_easy_perform(curl); 
     cout << "call made.." << endl; 
     if (CURLE_OK == res) 
     { 
      char *ct; 
      res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct); 
      if((CURLE_OK == res) && ct) 
      { 
       cout << "returning downloaded resposne" << endl; 
       return *DownloadedResponse; 
      } 
     } 
     else 
     { 
      cout << "CURLCode: " << res << endl; 
     } 
    } 
    cout << "Returning null" << endl; 
    return NULL; 
} 

Выход

$ ./test-rest 
calling easy_perform 
In writer callback 
Buffer not nullSegmentation fault (core dumped) 

Как я неправильно используя строку в функции обратного вызова писатель?

ответ