2016-05-30 27 views
1

我正在實現一個C程序,它需要從Content-Length頭文件(當在響應頭文件中發送Content-Length時)讀取遠程文件的大小。如何使用CURLOPT_HEADERFUNCTION讀取單個響應標題字段?

我已經看過libcurl的文檔,並且迄今爲止能夠提供的最好功能是CURLOPT_HEADERFUNCTION設置的回調函數。我已經把一個回調,這是應該打印頭以STDOUT的玩具實施:

size_t hdf(char* b, size_t size, size_t nitems, void *userdata) { 
    printf("%s", b); 
    return 0; 
} 

雖然我希望能夠打印Content-Length頭(或者,至少,所有打印頭),我只能得到這個功能打印響應代碼:

$ ./curltest "some_url_which_sends_back_Content_Length" 
HTTP/1.1 200 OK 

如果我註釋掉我main這臺回調上面定義的hdf功能行,默認行爲是打印所有的頭到STDOUT

僅供參考,這裏是main功能我使用的基礎上,libcurl的郵件列表上線:

int main(int argc, char *argv[]) 
{ 
    CURLcode ret; 
    CURL *hnd = curl_easy_init(); 
    curl_easy_setopt(hnd, CURLOPT_URL, argv[1]); 
    curl_easy_setopt(hnd, CURLOPT_HEADER, 1); 
    curl_easy_setopt(hnd, CURLOPT_NOBODY, 1); 
    curl_easy_setopt(hnd, CURLOPT_HEADERFUNCTION, hdf); 
    ret = curl_easy_perform(hnd); 
    curl_easy_cleanup(hnd); 
} 

我怎麼能寫的CURLOPT_HEADERFUNCTION選項的回調,可以加載一個特定的頭進入內存或以其他方式操作 - 或者至少將所有頭文件加載到內存中?

回答

4

我只能得到這個功能打印響應代碼:

這個問題的答案是CURLOPT_HEADERFUNCTION文檔中:儘快

此功能得到由libcurl中被稱爲它已收到標題數據。標題回調將爲每個標題調用一次,只有完整的標題行傳遞給回調。使用這個解析頭文件非常簡單。 緩衝區指向的數據的大小是乘以nmemb的大小。不要認爲標題行是零終止!名爲userdata的指針是您使用CURLOPT_HEADERDATA選項設置的指針。 這個回調函數必須返回實際需要處理的字節數。如果該數量與傳遞給您函數的數量不同,它會向庫發出錯誤信號。這將導致傳輸中止,並且正在進行的libcurl函數將返回CURLE_WRITE_ERROR

printf()通話假設空終止,並且您的回調將返回比提供更少的字節,所以收到的第一個響應行後你是中止的響應。

試試這個。

size_t hdf(char* b, size_t size, size_t nitems, void *userdata) { 
    size_t numbytes = size * nitems; 
    printf("%.*s\n", numbytes, b); 
    return numbytes; 
} 

我怎麼能寫上可在特定頭加載到內存中或以其他方式操縱它的CURLOPT_HEADERFUNCTION選項回調 - 或者,至少,所有的標題加載到內存?

修復bug後,您應該可以看到所有標題。然後,您可以解析b查找Content-Length標題,並在找到時將其數據保存到緩衝區,然後通過CURLOPT_HEADERDATA傳遞給userdata

現在,就是說,有一種更簡單的方法來檢索Content-Length值。執行HEAD請求與curl_easy_perform()CURLOPT_NOBODY),如果成功不是使用curl_easy_getinfo()檢索CURLINFO_CONTENT_LENGTH_DOWNLOAD值:

CURLINFO_CONTENT_LENGTH_DOWNLOAD
從Content-Length頭內容長度。

+0

噢,我必須更多關注文檔。感謝您的解釋! – Jules

相關問題