C++ Libcurl 无法清除 header

标签 c++ http-headers libcurl request-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它显示像我一样使用它。至少我是这么理解的...

那么我做错了什么和/或遗漏了什么?

感谢您的回答

* 编辑 *

所以,基本上:

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 调用中使用的 header ,这样我得到: 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);
    }

关于C++ Libcurl 无法清除 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42989149/

相关文章:

c++ - 求和 std::vector 是使用引用而不是值?

c++ - 如何在 Mac OS X 10.9 上安装 ZeroMQ 以便在 C/C++ 程序中使用

sockets - 如何要求 libcurl 不监听套接字只是发送一个 url 请求?

visual-studio-2010 - 使用 Visual Studio 2010 构建 cURL 和 libcurl

c++ - 面向初学者的 C++ 中的 nan

c++ - 如果事先不知道所有的类,如何实现双重调度?

没有 Transfer-Encoding 和 Content-Length 的 HTTP 响应 header 是否有效?

c# - 在 Asp.net Web API 中处理 CORS 预检

javascript - 如何在 Chrome 中定义 SharedArrayBuffer?

c++ - 从 libcurl 为 HTTP POST 计算 Content-MD5