gpt4 book ai didi

ios - 在 iOS/OSX 上处理 HTTP header 字段名称

转载 作者:可可西里 更新时间:2023-11-01 06:23:28 28 4
gpt4 key购买 nike

我们知道 HTTP header 名称不区分大小写,这在 RFC2616 中指定。 .

但是我发现所有流行的 iOS/OSX 框架,例如 ASIHTTRequest , AFNetworking , RestKit使用以下代码测试 header 字段是否存在。

[[self responseHeaders] objectForKey:@"Keep-Alive"];
[[self responseHeaders] objectForKey:@"Content-Length"];

responseHeaders 只是一个 NSDictionary。我原以为 CFNetwork 层会处理这个问题,但没有找到任何线索。也许这是现实世界中的约定?

最佳答案

实际上,-[NSHTTPURLResponse allHeaderFields] 方法返回一个不区分大小写的 NSDictionary 实例。这与最近版本的 CFNetwork 中删除的 _CFCapitalizeHeader 函数无关。不幸的是,它的源代码不再可用。

这是 allHeaderFields 方法的简化调用图 (OS X 10.8.3)

-[NSHTTPURLResponse allHeaderFields] -- Foundation
CFHTTPMessageCopyAllHeaderFields() -- CFNetwork
HTTPMessage::copyAllHeaderFields(__CFArray const**)
MixedDict::copyAsOrdinaryDict(__CFAllocator const*, __CFArray const**) const
CFDictionaryCreateMutable()

该字典最终作为 allHeaderFields 方法的结果返回。这是third parameter传递给 CFDictionaryCreateMutable 看起来像:

version = 0
retain = _keyRetain(__CFAllocator const*, void const*) // __ZL10_keyRetainPK13__CFAllocatorPKv
release = _keyRelease(__CFAllocator const*, void const*) // __ZL11_keyReleasePK13__CFAllocatorPKv
copyDescription = _keyCopyDescription(void const*) // __ZL19_keyCopyDescriptionPKv
equal = _keyEqual(void const*, void const*) // __ZL9_keyEqualPKvS0_
hash = _keyHash(void const*) // __ZL8_keyHashPKv

_keyEqual C++ 方法最终调用带有kCFCompareCaseInsensitive 选项的CFStringCompare

这就是为什么不关心 NSHTTPURLResponse header 是否区分大小写的原因。

非常遗憾的是,这种行为没有被记录下来。请骗雷达#13715902要求提供文件。

关于ios - 在 iOS/OSX 上处理 HTTP header 字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15611184/

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