【发布时间】:2017-03-24 00:04:49
【问题描述】:
我有以下循环执行的 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_slist_free_all()时遇到的实际问题是什么?它只能释放与列表关联的内存,但它不能将您的LibcurlHeaders变量设置为 NULL,如果这是您所期望的。在调用curl_slist_append()之前确保LibcurlHeaders最初为NULL,以便它分配一个新列表,然后在使用完成后使用curl_slist_free_all()释放列表。 -
我在脚本开始时将 LibcurlHeaders 设置为 null。好吧,当我添加启用 curl_slist_free_all 选项时,我的应用程序崩溃了...我希望该功能能够清除标头,因为过了一段时间我收到了来自服务器的 400 错误请求作为响应,因为发送的标头正在增长并且变得很大之后一会儿...因为我不知道如何重置 LibCurl 的 LibcurlHeaders (slist)
-
嗯,您不认为这是应该包含在您的问题中的相关信息吗?始终提供具体的详细信息,并提供minimal reproducible example 来展示实际存在的问题。
-
另外,由于您标记了问题
C++,您可能会考虑使用libcurl 的C++ Bindings 之一,而不是直接使用C API。让 Binding 为您处理内存管理。 -
"一段时间后,我收到了来自服务器的 400 错误请求作为响应因为发送的标头正在增长并在一段时间后变得很大 " - 这意味着
LibcurlHeaders在调用curl_slist_append()之前not NULL,因此您将越来越多的标头附加到单个列表中,以便在每个请求中重用。更有理由显示minimal reproducible example 来验证这一点。
标签: c++ http-headers libcurl request-headers