2011-11-12 78 views
1

最近我正在用libcurl構建一個從網上抓取網頁的程序,我發現當使用分塊編碼的響應時,libcurl無法獲取塊頭。然後我查看libcurl在線文檔,它說通過WriteFunction處理塊頭問題,我使用libcurl版本2.18,並且爲CURLOPT_WRITEFUNCTION和CURLOPT_HEADERFUNCTION設置了回調,它們除了關於塊頭的單個字符以外都只有一個字符,是否有關於libcurl和塊編碼的問題?我怎樣才能使它正常工作?感謝p.s.我試圖抓住網絡是http://list.taobao.com/browse/cat-0.htm,這是一箇中國的網站使用GBK編碼libcurl process chunked response

此處設置我做出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_); 

回調是根據需要聲明,緩衝區中的塊長度傳遞給調試功能,但沒有寫入函數,我如何在寫入函數中獲得它

+0

您是否嘗試過的選項CURLOPT_DEBUGFUNCTION和CURLOPT_HTTP_TRANSFER_DECODING? – rushman

+0

啊,這次我得到了東西,在hex中有一個4字節的整數字符串來響應正文,這是塊長度的權利?我在調試函數中得到了這個,並且當writefunctin被調用時,整數消失了,我可以得到這個長度通過調用某個api?或者我只能在調試功能中讀取它?謝謝 – zorroii

+0

你可以發佈你的代碼嗎? – rushman

回答

0

libcurl無條件支持分塊編碼,無需應用程序執行任何操作。

如果你沒有得到任何的數據是,有某種問題/錯誤/問題的...