【问题标题】:How do u get the response header from libcURL with c++您如何使用 C++ 从 libcURL 获取响应标头
【发布时间】:2021-03-16 16:45:47
【问题描述】:

好的,所以基本上我想要在我发送我的帖子请求之后的响应标头。

这是我的发送邮政编码



    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);


k 所以我在这里尝试创建一个缓冲区,用于我的用户数据*

回调函数:

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;
}

现在我认为我的缓冲区会被头部缓冲区中的字符填充,但是当我尝试从这个回调函数外部再次计算缓冲区时,我什么也得不到。

基本上需要帮助来使用用户数据和缓冲区来将我的变量从这个函数中取出,即它的 noobxd。

【问题讨论】:

    标签: c++ libcurl


    【解决方案1】:

    您的CURLOPT_HEADERFUNCTION 回调假设提供的buffer 是空终止的,但事实并非如此。 documentation 甚至这么说:

    libcurl 在收到标头数据后立即调用此函数。标题回调将为每个标题调用一次,并且只有完整的标题行被传递给回调。使用它解析标题非常容易。 buffer指向传递的数据,该数据的大小为nitemssize 始终为 1。不要假设标题行以 null 结尾!

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

    试试类似的方法:

    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);
    ...
    
    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-&gt;recvHeadBuff 以使用与pDataInfo-&gt;PostData 相同的字符串类型(我假设std::string)而不是char*,然后您可以这样做:

    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);
    ...
    
    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2017-07-19
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多