2

CFNetwork を使用してヘッダーを読み込んでおり、リクエストがどのタイプの「Transfer-Encoding」かを読み取ろうとしています。「チャンク」する必要があります 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);
        }
    }

助けてくれてありがとう。

4

1 に答える 1

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」が設定されています。

于 2013-01-02T18:26:38.507 に答える