C ++ Libcurl не может очистить заголовки

У меня есть следующая функция curl, которая выполняется в цикле:

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();

Все отлично работает, когда я удаляю строку:

curl_slist_free_all(LibcurlHeaders);

Однако в Libcurl Docs это показывает, чтобы использовать это, как я. По крайней мере, так я это понимаю …

Так что же я делаю не так и / или отсутствует?

Спасибо за ваши ответы

* РЕДАКТИРОВАТЬ *

Итак, в основном:

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

Я хочу, чтобы заголовки, используемые в вызове curl, очищались при завершении вызова curl, поэтому я получаю:
LibcurlHeaders = null:

Curl call with headers
Headers cleared
Curl call with headers
Headers cleared
Curl call with headers
Headers cleared

1

Решение

В комментариях вы сказали, что вызываете curl в цикле. Ваш пример не показывает это. Но если предположить, что код, который вы показали, находится внутри большего кода, который фактически находится в цикле, вам просто нужно убедиться, что ваш LibcurlHeaders переменная NULL перед звонком curl_slist_append() в первый раз каждого нового HTTP-запроса, например:

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

Другие решения

Wauw,

Мне удалось решить проблему. Кажется, это ошибка в Libcurl, которую можно легко исправить.

Проблема заключалась в том, что я объявил struct curl_slist *LibcurlHeaders=NULL; во всем мире.

Когда я объявил struct curl_slist *LibcurlHeaders=NULL; перед каждым curl_easy_init(); вызовите и удалите глобальную декларацию, curl_slist_free_all(LibcurlHeaders); работал и больше не ломал мою программу!

Короткий:

Проблема заключалась в глобальной декларации struct curl_slist *LibcurlHeaders=NULL; который должен был быть объявлен перед каждым curl_easy_init(); функция.

0

По вопросам рекламы [email protected]