C++ Libcurl 无法清除 headers

C++ Libcurl can't clear headers

我有以下循环执行的 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 中它显示像我一样使用它。至少我是这么理解的...

所以我做错了什么 and/or 不见了?

感谢您的回答

* 编辑 *

所以,基本上:

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 调用中使用的 headers 在 curl 调用完成后被清除,所以我得到: LibcurlHeaders = null:

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

您在评论中说您正在循环调用 curl。你的例子没有说明这一点。但是假设您确实显示的代码在实际上处于循环中的较大代码内部,您只需要确保您的 LibcurlHeaders 变量在第一次调用 curl_slist_append() 之前是 NULL每个新的 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);
    }

哇,

我设法解决了这个问题。这似乎是 Libcurl 的一个错误,可以很容易地修复。

问题是我在全局声明了 struct curl_slist *LibcurlHeaders=NULL;

当我在每次 curl_easy_init(); 调用之前声明 struct curl_slist *LibcurlHeaders=NULL; 并删除全局声明时,curl_slist_free_all(LibcurlHeaders); 起作用并且不再使我的程序崩溃!

短:

问题是 struct curl_slist *LibcurlHeaders=NULL; 的全局声明必须在每个 curl_easy_init(); 函数之前声明。