实际上,该-[NSHTTPURLResponse allHeaderFields]
方法返回一个不区分大小写的 NSDictionary 实例。_CFCapitalizeHeader
这与CFNetwork 最新版本中删除的功能无关。不幸的是,它的源代码不再可用。
这是该allHeaderFields
方法的简化调用图(OS X 10.8.3)
-[NSHTTPURLResponse allHeaderFields] -- Foundation
CFHTTPMessageCopyAllHeaderFields() -- CFNetwork
HTTPMessage::copyAllHeaderFields(__CFArray const**)
MixedDict::copyAsOrdinaryDict(__CFAllocator const*, __CFArray const**) const
CFDictionaryCreateMutable()
该字典最终作为allHeaderFields
方法的结果返回。这是传递给的第三个参数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++ 方法最终CFStringCompare
使用该选项kCFCompareCaseInsensitive
调用。
这就是为什么不关心 NSHTTPURLResponse 标头是否区分大小写的原因。
但是,非常不幸的是,这种行为没有记录在案。请欺骗雷达#13715902要求提供文件。