【问题标题】:libcurl process chunked responselibcurl 进程分块响应
【发布时间】:2011-11-12 14:48:15
【问题描述】:

最近我正在构建一个使用 libcurl 从互联网上抓取网页的程序,我发现当使用分块编码的响应时,libcurl 无法获取块头。然后我查看了 libcurl 在线文档,它说块头通过WriteFunction,我正在使用 libcurl 2.18 版,并且我为 CURLOPT_WRITEFUNCTION 和 CURLOPT_HEADERFUNCTION 设置了回调,除了块头的单个字符之外,他们得到了任何东西,关于块编码的 libcurl 有问题吗?我怎样才能让它正常工作?谢谢 p.s.我要抓取的网站是http://list.taobao.com/browse/cat-0.htm,这是一个使用gbk编码的中文网站

这是我对 cliburl 所做的设置

int32_t progress = 0;
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_NOPROGRESS, progress) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_HEADER, 1) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_DEBUGFUNCTION, &HttpSpider::curl_debug_callback) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_HTTP_TRANSFER_DECODING, 1) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_WRITEFUNCTION, &HttpSpider::_ProcessRecvString) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_HEADERFUNCTION, &HttpSpider::_ProcessRecvHeader) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_PROGRESSFUNCTION, &HttpSpider::_ProcessRecvProgress) == CURLE_OK);

//还有其他的

result = curl_easy_setopt(inst->handle_, CURLOPT_HTTPGET, 1);
result = curl_easy_setopt(inst->handle_, CURLOPT_PROGRESSDATA, param);
result = curl_easy_setopt(inst->handle_, CURLOPT_WRITEDATA, param);
result = curl_easy_setopt(inst->handle_, CURLOPT_WRITEHEADER, param);
result = curl_easy_setopt(inst->handle_, CURLOPT_URL, *url);

printf("/**********     HTTP GET     **********/\n");
//try to perform a post action
result = curl_easy_perform(inst->handle_);  

根据需要声明回调,缓冲区中有块长度传递给调试函数,但在 writefunction 中没有,我如何在 writefunction 中获取它

【问题讨论】:

  • 您尝试过 CURLOPT_DEBUGFUNCTION 和 CURLOPT_HTTP_TRANSFER_DECODING 选项吗?
  • 啊,这次我得到了一些东西,响应正文中有一个 4 字节的十六进制整数字符串,这是块长度对吗?我在调试函数中得到了这个,当调用 writefunctin 时,整数消失了,我可以通过调用某个 api 来获得这个长度吗?或者我只能在调试函数中读取它?谢谢
  • 我贴了一些代码,主要是对libcurl的设置,够吗?
  • 你能告诉我“param”被声明为什么吗?
  • param 只是一个结构体,包含一个接收响应的缓冲区,以及它的长度

标签: windows libcurl chunked-encoding


【解决方案1】:

libcurl 自动且无条件地支持分块编码,无需应用程序执行任何操作。

如果您仍然没有获得任何数据,则存在某种问题/错误/问题...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    相关资源
    最近更新 更多