2012-10-16 26 views
1

我使用CFNetwork的通過標題來閱讀,我想讀什麼類型的「傳輸編碼」我的要求是。它應該是「分塊的」Wireshark顯示「Transfer-Encoding:chunked」的正確請求,但使用CFNetwork的實際代碼將請求標題重新映射爲「Transfer-Encoding:Identity」CFNetwork的讀取HTTP頭傳輸編碼身份,但Wireshark的節目分塊

有人知道爲什麼會發生這種情況嗎?

這裏是我的代碼讀取頭:

if (r->_headers) { 
     CFStringRef header_return = CFStringCreateWithFormat (kCFAllocatorDefault, NULL, CFSTR("%@: %@\r\n"), key, value); 
     if (header_return) {    
      char temp[256]; 
      CFStringGetCString(header_return, temp, sizeof(temp), kCFStringEncodingUTF8); 

      char *trans_enc = NULL; 
      if (pico_http_internal_native_header_get(temp, "Transfer-Encoding:", &trans_enc)) { 
       if (strcmp(trans_enc, "chunked") == 0) { // <-- This always says "Identity" 
        r->_chunked = true; // Never hit, but wireshark shows it would be correct 
       } 
      } 

      r->_headers(r->_context, temp, strlen(temp)); 
      pico_cfrelease(header_return); 
     } 
    } 

預先感謝任何幫助。

+0

我剛剛遇到了同樣的問題。 Chrome顯示** chunked **,而Mac上的Safari顯示**身份**。還不明白。如果您發現有用的東西,請告訴我。 – Eye

+0

嗨@Eye我添加了答案,我最終在我的代碼中使用。希望它有幫助。 –

回答

1

我用下面的邏輯,以確定它是否是分塊或不:

// response header info 
    if(CFHTTPMessageIsHeaderComplete(cf_response)) { 
     CFDictionaryRef headers = CFHTTPMessageCopyAllHeaderFields(cf_response); 
     if (headers) { 
      CFDictionaryApplyFunction(headers, pico_http_internal_cfnetwork_header_apply_callback, r); 
      if((CFDictionaryContainsKey(headers, CFSTR("Content-Length")) == false) && (CFDictionaryContainsKey(headers, CFSTR("Transfer-Encoding")) == true) 
       && (CFDictionaryContainsValue(headers, CFSTR("Keep-Alive")) == true)) { 
       r->_chunked = true; 
       } 
    } 

基本上,如果不存在「內容長度」中的標頭,但標頭報告「傳輸編碼」,和據報道,「保持活躍」是一種分塊響應。這些是分塊響應和非分塊響應之間的主要區別。分塊響應不使用「Content-Length」,但設置了「Transfer-Encoding」和「Keep-Alive」。