首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用libcURL从c++获得响应头?

如何使用libcURL从c++获得响应头?
EN

Stack Overflow用户
提问于 2021-03-16 16:45:47
回答 1查看 2.1K关注 0票数 0

好的,基本上,在发送post请求之后,我需要响应头。

这是我的邮编

代码语言:javascript
复制
    pDataInfo->recvHeadBuff = (char*)VirtualAlloc(NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    InitPost(pDataInfo);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 5L);
    curl_easy_setopt(curl, CURLOPT_URL, pDataInfo->URL);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, pDataInfo->PostData.c_str());
    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
    curl_easy_setopt(curl, CURLOPT_HEADERDATA, pDataInfo->recvHeadBuff);
    curl_easy_perform(curl);
    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &pDataInfo->repCode);

就在这里,我试图创建一个缓冲区,用于我的用户数据*

回调功能:

代码语言:javascript
复制
static size_t header_callback(char* buffer, size_t size,
    size_t nitems, void* userdata)
{
    
    strcpy((char*)userdata, buffer);
    
    std::cout << (char*)userdata; // This prints the headers correctly

    return nitems * size;
}

现在,我认为我的缓冲区将被来自头缓冲区的字符填充,但是当我试图从这个回调函数之外再次显示缓冲区时,我什么也得不到。

基本上需要帮助才能使用userdata和缓冲区来从这个函数中提取变量,比如noobxd。

EN

回答 1

Stack Overflow用户

发布于 2021-03-16 18:11:20

您的CURLOPT_HEADERFUNCTION回调假设提供的buffer为空终止,但它不是。文档甚至这么说:

这个函数一收到头数据就会被libcurl调用。头回调将对每个标头调用一次,并且只将完整的头行传递给回调。使用此方法解析标头非常容易。buffer指向交付的数据,该数据的大小为nitemssize始终为1。不假定标题行为空终止!

您还假设完整的头将适合您正在分配的4K recvHeadBuff中,但这也不能保证,因此您正在冒缓冲区溢出的风险。

尝试更像这样的东西:

代码语言:javascript
复制
std::string headers;
InitPost(pDataInfo);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 5L);
curl_easy_setopt(curl, CURLOPT_URL, pDataInfo->URL);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, pDataInfo->PostData.c_str());
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &headers);
curl_easy_perform(curl);
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &pDataInfo->repCode);
// use headers as needed...
DWORD size = (headers.size() + 1) * sizeof(char);
pDataInfo->recvHeadBuff = (char*) VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (pDataInfo->recvHeadBuff)
    CopyMemory(pDataInfo->recvHeadBuff, headers.c_str(), size);
...
代码语言:javascript
复制
static size_t header_callback(char* buffer, size_t size,
    size_t nitems, void* userdata)
{
    std::string *headers = (std::string*) userdata;
    headers->append(buffer, nitems * size);
    return nitems * size;
}

或者,您应该将pDataInfo->recvHeadBuff更改为使用与pDataInfo->PostData使用的字符串类型相同的字符串类型(我假设是std::string),而不是char*,然后您可以这样做:

代码语言:javascript
复制
InitPost(pDataInfo);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 5L);
curl_easy_setopt(curl, CURLOPT_URL, pDataInfo->URL);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, pDataInfo->PostData.c_str());
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &(pDataInfo->recvHeaders));
curl_easy_perform(curl);
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &pDataInfo->repCode);
...
代码语言:javascript
复制
static size_t header_callback(char* buffer, size_t size,
    size_t nitems, void* userdata)
{
    std::string *headers = (std::string*) userdata;
    headers->append(buffer, nitems * size);
    return nitems * size;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66659641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档