- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们知道 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/
概述 CentOS Stream 成立于 2019 年,是“RHEL 下一步的滚动预览”。Red Hat 首席技术官 Chris Wright 和 CentOS 社区经理 Rich Bowen 各
我有一个使用 Mesosphere DC/OS 编排选项进行配置的 Azure 容器服务 (ACS) 集群。我可以在 Marathon UI 中创建一个应用程序。 但是,当我通过 Marathon U
我是一名优秀的程序员,十分优秀!