У меня есть следующая функция 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
В комментариях вы сказали, что вызываете 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);
}
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();
функция.