实际上,-[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 标头是否区分大小写的原因。
很遗憾,这种行为没有记录在案。请欺骗雷达#13715902 要求提供文件。