фрагментированный ответ процесса libcurl

#windows #libcurl #chunked-encoding

#Windows #libcurl #фрагментированное кодирование

Вопрос:

недавно я создавал программу, которая получала веб-страницы из Интернета с помощью 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, amp;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, amp;HttpSpider::_ProcessRecvString) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_HEADERFUNCTION, amp;HttpSpider::_ProcessRecvHeader) == CURLE_OK);
PROCESS_ERROR(curl_easy_setopt(handle_, CURLOPT_PROGRESSFUNCTION, amp;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_);  
  

обратные вызовы объявляются по мере необходимости, длина фрагмента в буфере передается в debugfunction, но не в writefunction, как я могу получить его в writefunction

Комментарии:

1. Вы пробовали опции CURLOPT_DEBUGFUNCTION и CURLOPT_HTTP_TRANSFER_DECODING?

2. ах, на этот раз я кое-что понял, с телом ответа поставляется целочисленная строка в 4 байта в шестнадцатеричном формате, это длина фрагмента, верно? я получил это в функции debug, и когда вызывается функция writefunctin, целое число исчезает, могу ли я получить эту длину, вызвав определенный API? или я могу прочитать это только в debugfunction? Спасибо

3. я опубликовал часть кода, в основном настройки, сделанные в libcurl, этого будет достаточно?

4. Можете ли вы сказать мне, как объявлен «параметр»?

5. param — это просто структура, содержащая буфер для получения ответа и его длину

Ответ №1:

libcurl поддерживает фрагментированное кодирование автоматически и безоговорочно, без каких-либо действий приложения.

Если вы по-прежнему не получаете никаких данных, значит, возникла какая-то проблема…