如何使用libcurl存储发送/接收的数据



我想为一个小项目实现一些curl和curlcpp函数。

到目前为止,我已经实现了一些功能,但现在我想添加功能。这个想法是将发送和接收的数据存储在缓冲区中,以便以后可以访问:

<<ul>
  • 发送数据/gh><<li>发送头/gh>
  • 接收的数据
  • 收到标题
  • 我知道有CURLOPT_WRITEFUNCTION,但这只适用于响应数据,我也需要输出数据/标头。CURLOPT_DEBUGFUNCTION看起来对我有用,但我不能在CPP上配置它。

    下面是我的类的示例代码:

    class CurlCPPClient
    {
    private:
    ...
    int trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);
    curl::curl_easy curl_easy;
    std::string raw_data;
    public:
    ...
    }
    CurlCPPClient::CurlCPPClient()
    {
    curl_easy.add<CURLOPT_DEBUGFUNCTION>(this->trace_data);
    }
    int CurlCPPClient::trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr) 
    {
    std::string frame_info(data);
    switch(type)
    {
    case CURLINFO_HEADER_OUT:
    case CURLINFO_DATA_OUT:
    raw_data += frame_info;
    break;
    case CURLINFO_HEADER_IN:
    case CURLINFO_DATA_IN:
    raw_data += frame_info;
    break;
    default:
    break;
    }
    return 0;
    }
    

    在将函数指针设置为trace_data时,我有编译器问题。我得到"错误c3867";"错误C2228"使用:this->trace_data, this。trace_data trace_data。如果我不使用trace_data作为我的类的方法,我可以调用它,但我不能保存成员的信息,以便以后在类的另一部分访问它。

    libcurl的回调函数需要独立的c风格函数。不能使用非静态类方法用于回调。

    声明你的trace_data()方法为static。您可以使用CURLOPT_DEBUGDATACurlCPPClient对象的this指针传递给方法的userptr参数。

    class CurlCPPClient
    {
    private:
    ...
    static int trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);
    curl::curl_easy curl_easy;
    std::string raw_data;
    public:
    ...
    }
    CurlCPPClient::CurlCPPClient()
    {
    curl_easy.add<CURLOPT_DEBUGFUNCTION>(&CurlCPPClient::trace_data);
    curl_easy.add<CURLOPT_DEBUGDATA>(this);
    }
    int CurlCPPClient::trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr) 
    {
    CurlCPPClient *pThis = static_cast<CurlCPPClient*>(userptr);
    std::string frame_info(data, size);
    switch(type)
    {
    case CURLINFO_HEADER_OUT:
    case CURLINFO_DATA_OUT:
    pThis->raw_data += frame_info;
    break;
    case CURLINFO_HEADER_IN:
    case CURLINFO_DATA_IN:
    pThis->raw_data += frame_info;
    break;
    default:
    break;
    }
    return 0;
    }
    

    或者,使用CURLOPT_DEBUGDATAraw_data成员传递给回调:

    class CurlCPPClient
    {
    private:
    ...
    static int trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr);
    curl::curl_easy curl_easy;
    std::string raw_data;
    public:
    ...
    }
    CurlCPPClient::CurlCPPClient()
    {
    curl_easy.add<CURLOPT_DEBUGFUNCTION>(&CurlCPPClient::trace_data);
    curl_easy.add<CURLOPT_DEBUGDATA>(&raw_data);
    }
    int CurlCPPClient::trace_data(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr) 
    {
    std::string *pRawData = static_cast<std::string*>(userptr);
    std::string frame_info(data, size);
    switch(type)
    {
    case CURLINFO_HEADER_OUT:
    case CURLINFO_DATA_OUT:
    *pRawData += frame_info;
    break;
    case CURLINFO_HEADER_IN:
    case CURLINFO_DATA_IN:
    *pRawData += frame_info;
    break;
    default:
    break;
    }
    return 0;
    }
    

    相关内容

    • 没有找到相关文章

    最新更新