CFNetwork читает http-заголовок Transfer-Encoding Identity, но wirehark показывает фрагменты

Я использую CFNetwork для чтения заголовков, и я пытаюсь прочитать, какой тип «кодирования передачи» мой запрос. Он должен быть "разбит на части". Wireshark показывает правильный запрос "Transfer-Encoding: chunked", но на самом деле код, использующий CFNetwork, перенаправляет заголовок запроса как "Transfer-Encoding: Identity"

Кто-нибудь знает, почему это происходит?

Вот мой код, который читает заголовки:

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);
        }
    }

Заранее благодарю за любую помощь.


person Michael Wildermuth    schedule 16.10.2012    source источник
comment
Я только что столкнулся с той же проблемой. В Chrome отображается фрагмент, а в Safari на Mac отображается идентификатор. Пока не совсем понимаю. Пожалуйста, дайте мне знать, если найдете что-нибудь полезное.   -  person Eye    schedule 30.12.2012
comment
Привет, @Eye, я добавил ответ, который в конечном итоге использовал в своем коде. Надеюсь, это поможет.   -  person Michael Wildermuth    schedule 02.01.2013


Ответы (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» сообщается, то это фрагментированный ответ. Это основные различия между ответом с фрагментами и ответом без фрагментов. В ответах с фрагментами не используется параметр Content-Length, но для них заданы параметры Transfer-Encoding и Keep-Alive.

person Michael Wildermuth    schedule 02.01.2013