LibCurl-如何更新已经设置的特定头信息?



我需要修改报头请求中的特定信息,如授权令牌。有没有办法只更新特定的标题,保持其余的?目前,我正在做下面的事情。但不确定是否有其他方法?

struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Accept:");
headers = curl_slist_append(headers, "Authorization: ABCDC0F725997BEF3C6B90B0E39D9C314DCB58553FA47CD3598BBB8910A8CE6E");
headers = curl_slist_append(headers, "Host: localhost");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

//Updating the header like this
auto *test = headers;
while (test != NULL)
{
if (strstr(test->data, "Authorization:"))
{
strcpy_s(test->data, strlen("Authorization: A5484526D0F7A671ABCD0C091755532A63475719E460ED6A807C4AAD70BCEDA0") + 1, "Authorization: A5484526D0F7A671CE400C091755532A63475719E460ED6A807C4AAD70BCEDA0");
break;
}
test = test->next;
}

你所做的是危险的,有以下两个原因:

  1. test->data可能没有足够长的时间来保存数据复制,并且最终会将数据写入不应该写入的地方。
  2. test->data可能比您正在复制的数据更长,因此头在末尾会有不需要的数据。

基于curl的源代码,看起来打破抽象将工作得很好,所以我们可以使用您设置test->data的方法,但进行以下修改:

static const char *newheaderdata = "Authorization: A5484526D0F7A671CE400C091755532A63475719E460ED6A807C4AAD70BCEDA0";
while (test != NULL)
{
if (strstr(test->data, "Authorization:"))
{
free(test->data);
test->data = strdup(newheaderdata) 
break;
}
test = test->next;
}

通常你不能像你实现它那样做。test->data分配的大小未知。只有当头长度固定时,你的代码才能正常工作。

libcurl代码可能会更改,所以free(test->data); test->data = strdup(newdata)不是一个好主意。

#include <curl/curl.h>
#if LIBCURL_VERSION_MAJOR != 7 || LIBCURL_VERSION_MINOR != 79 || LIBCURL_VERSION_PATCH != 1
# error "libcurl version is is changed. Be sure Curl_slist_duplicate is not changed in lib/slist.h"
#endif
struct curl_slist *Curl_slist_duplicate(struct curl_slist *inlist);
struct curl_slist* headers = nullptr;
struct curl_slist* commonheaders = nullptr;
commonheaders = curl_slist_append(commonheaders, "Accept:");
commonheaders = curl_slist_append(commonheaders, "Host: localhost");
// Update the headers.
curl_slist_free_all(headers);
headers = Curl_slist_duplicate(commonheaders);
headers = curl_slist_append(headers, "Authorization: ABCDC0F725997BEF3C6B90B0E39D9C314DCB58553FA47CD3598BBB8910A8CE6E");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

#include <curl/curl.h>
struct curl_slist* headers = nullptr;
struct curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "Accept:");
headers = curl_slist_append(headers, "Host: localhost");
headers = curl_slist_append(headers, "Authorization: ABCDC0F725997BEF3C6B90B0E39D9C314DCB58553FA47CD3598BBB8910A8CE6E");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// Remove the last header.
curl_slist* h = headers;
for (curl_slist* next = h->next; next->next; h = next->next, next = h->next) {}
curl_slist_free_all(h->next);
h->next = nullptr;
// Append new header.
headers = curl_slist_append(headers, "Authorization: ABCDC0F725997BEF3C6B90B0E39D9C314DCB58553FA47CD3598BBB8910A8CE6E");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

最新更新