Tengo la siguiente función curl que se ejecuta en un bucle:

curl = curl_easy_init();
if (curl) {
    CurlResponse = "";
    host = "http://exaple.com";
    LibcurlHeaders = curl_slist_append(LibcurlHeaders, "Expect:");
    curl_easy_setopt(curl, CURLOPT_URL, (host).c_str());
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER , 1);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST , 1);
    curl_easy_setopt(curl, CURLOPT_CAINFO, SSLPath.c_str());
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, LibcurlHeaders);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, CurlVerbose);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, CurlPostData.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, LibcurlResponse);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &CurlResponse);
    res = curl_easy_perform(curl);
    curl_slist_free_all(LibcurlHeaders);        <----------
    if (res != CURLE_OK) {
        LibcurlError(curl_easy_strerror(res), host);
        }
    curl_easy_cleanup(curl);
    }
curl_global_cleanup();

Todo funciona bien cuando elimino la línea:

curl_slist_free_all(LibcurlHeaders);

Sin embargo, en el Libcurl Docs muestra que lo uso como lo hago yo. Al menos así es como lo entiendo ...

Entonces, ¿qué estoy haciendo mal o falta?

Gracias por sus respuestas

* EDITAR *

Así que básicamente:

LibcurlHeaders = null:

Curl call with headers
// cant clear headers
Curl call with 2 headers
// can't clear headers
Curl call with 3 headers
// can't clear headers

Lo que quiero es que los encabezados utilizados en la llamada curl se borren cuando se realiza la llamada curl, así que obtengo: LibcurlHeaders = null:

Curl call with headers
Headers cleared
Curl call with headers
Headers cleared
Curl call with headers
Headers cleared
1
TVA van Hesteren 24 mar. 2017 a las 03:04

2 respuestas

La mejor respuesta

Usted dijo en los comentarios que está llamando a curl en un bucle. Tu ejemplo no muestra eso. Pero suponiendo que el código que mostró está dentro de un código más grande que en realidad está en un bucle, solo necesita asegurarse de que su LibcurlHeaders variable sea NULL antes de llamar a curl_slist_append() por primera vez de cada nueva solicitud HTTP, por ejemplo:

curl = curl_easy_init();
if (curl) {
    CurlResponse = "";
    host = "http://exaple.com";

    LibcurlHeaders = NULL; // <-- HERE
    LibcurlHeaders = curl_slist_append(LibcurlHeaders, "Expect:");

    /* alternatively, and ultimately safer and more accurate:
    LibcurlHeaders = curl_slist_append(NULL, "Expect:");
    */

    curl_easy_setopt(curl, CURLOPT_URL, host.c_str());
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
    curl_easy_setopt(curl, CURLOPT_CAINFO, SSLPath.c_str());
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, LibcurlHeaders);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, CurlVerbose);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, CurlPostData.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, LibcurlResponse);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &CurlResponse);

    res = curl_easy_perform(curl);

    curl_slist_free_all(LibcurlHeaders);
    LibcurlHeaders = NULL; // <-- FOR GOOD MEASURE!

    if (res != CURLE_OK) {
        LibcurlError(curl_easy_strerror(res), host);
        }

    curl_easy_cleanup(curl);
    }
1
Remy Lebeau 24 mar. 2017 a las 00:38

Wauw

Me las arreglé para solucionar el problema. Parece ser un error con Libcurl que se puede solucionar con bastante facilidad.

El problema fue que declaró struct curl_slist *LibcurlHeaders=NULL; a nivel mundial.

Cuando declaró struct curl_slist *LibcurlHeaders=NULL; justo antes de cada curl_easy_init(); llamada y eliminé la declaración global, el curl_slist_free_all(LibcurlHeaders); funcionó y ya no bloqueó mi programa.

Short:

El problema era la declaración global de struct curl_slist *LibcurlHeaders=NULL; que tenía que declararse delante de cada función curl_easy_init();.

0
TVA van Hesteren 24 mar. 2017 a las 12:36