簡體   English   中英

使用libcurl的HTTP響應分塊中缺少分塊大小

[英]Missing chunk size in chunked HTTP response using libcurl

我試圖使用curl庫來構建HTTP代理。 我現在面臨的問題是HTTP響應分塊不正確。 通過檢查文件保存的HTTP響應,我發現HTTP響應開始和結束時的塊大小丟失了。 來自curl回調函數的HTTP響應如下所示。

size_t httpClient::write_data(char *ptr, size_t size, size_t nmemb, void* userdata)
{   

    // get total size   
    size_t realsize = size*nmemb;
    // get object
    struct MemoryStruct* mem = (struct MemoryStruct*)userdata;

    // size of memory block pointerd by the mem->memory is changed to the new bytes
    mem->memory = (char*)realloc(mem->memory, (mem->size + realsize));

    if(mem->memory == NULL)
    {
        printf("not enough memory (realloc returned NULL)\n");
            exit(1);
    }

    // copy to memory structure
    memcpy(&(mem->memory[mem->size]), ptr, realsize);
    mem->size += realsize;
    //mem->memory[mem->size] = 0;

    cout<<"Write ["<<realsize<<"] bytes Data to chunk"<<endl;
    return realsize;

}

希望有人指出我為此回調函數犯的錯誤。 感謝:D

預期的分塊HTTP響應如下所示:

HTTP/1.1 200 OK^M
Date: Wed, 17 Oct 2012 07:44:54 GMT^M
Expires: -1^M
Cache-Control: private, max-age=0^M
Content-Type: text/html; charset=UTF-8^M
Set-Cookie: PREF=ID=58da9f2271ea2d2b:FF=0:TM=1350459894:LM=1350459894:S=EnJS1hQo2d6_AnPM; expires=Fri, 17-Oct-2014 07:44:54 GMT; path=/; domain=.google.com^M
Set-Cookie: NID=65=RW0txpQSNA4NwlRhp0y1I6iF3L0xfugw8Bv4GMsB1yE1qu7iGoBO_2ZxqS0-DSeS4tJKnV26JlfVZmsnjxnjdUaHTDj3-AFREsvyMiE8wSKyabwYG8x-e18Pj8smdxUs; expires=Thu, 18-Apr-2013 07:44:54 GMT; path=/; domain=.google.com; HttpOnly^M
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."^M
Content-Encoding: gzip^M
Transfer-Encoding: chunked^M
Server: gws^M
X-XSS-Protection: 1; mode=block^M
X-Frame-Options: SAMEORIGIN^M
^M
907a^M

十六進制格式的數字907a是我的HTTP響應文件中缺少的塊大小。

我可以向您提出以下步驟:

  1. 在您的代碼部分中,該設置回調函數將在堆棧上創建struct MemoryStruct
  2. 寫參數為原型回調函數的struct MemoryStruct *userdata代替void *userdata
  3. 您的代碼將如下所示:

     MemoryStruct data; curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_data); --------------------------------------------------------------------- // if you'll used std::string instead char* --------------------------------------------------------------------- size_t write_data(char *data, size_t size, size_t count, MemoryStruct *userdata) { int result = 0; if(userdata->memory != NULL) { userdata->memory->append(data, size*count); result = size*count; userdata->size += result; } return result; } 

使用curl庫curl_easy_perform(CURL *handler)調用函數后,您可以獲得正確的響應。

PS。 如果我錯理解您的問題,請在調用回調函數的地方顯示您的代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM