gpt4 book ai didi

iphone - CFNetwork 读取 http header Transfer-Encoding Identity 但 wireshark 显示分块

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:11:23 25 4
gpt4 key购买 nike

我正在使用 CFNetwork 阅读 header ,并且我正在尝试阅读我的请求是什么类型的“传输编码”。它应该是“分块的”Wireshark 显示正确的“Transfer-Encoding: chunked”请求,但使用 CFNetwork 的实际代码将请求 header 重新定义为“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);
}
}

在此先感谢您的帮助。

最佳答案

我使用以下逻辑来确定它是否被分块:

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

基本上,如果 header 中没有“Content-Length”,但 header 报告“Transfer-Encoding”,并且报告“Keep-Alive”,那么它就是一个分块响应。这些是分块响应和非分块响应之间的主要区别。分块响应不使用“Content-Length”,但设置了“Transfer-Encoding”和“Keep-Alive”。

关于iphone - CFNetwork 读取 http header Transfer-Encoding Identity 但 wireshark 显示分块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12921300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com