3

As we know HTTP header names are case insensitive which is specified in RFC2616.

However I found that all popular iOS/OSX framework such as ASIHTTRequest , AFNetworking ,RestKit test whether or not a header field exists using following code.

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

the responseHeaders is just an NSDictionary. I had thought CFNetwork layer would handle this however no clues found. Maybe this is a convention in real world?

4

3 回答 3

8

实际上,该-[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

_keyEqualC++ 方法最终CFStringCompare使用该选项kCFCompareCaseInsensitive调用。

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

但是,非常不幸的是,这种行为没有记录在案。请欺骗雷达#13715902要求提供文件。

于 2013-04-23T13:55:27.513 回答
1

我找到了答案。尽管没有关于此的文档。CFNetwork 层确实对标头字段进行了规范化。 http://www.opensource.apple.com/source/CFNetwork/CFNetwork-129.9/HTTP/CFHTTPMessage.c 工作在函数__CFCapitalizeHeader 中完成。

于 2013-04-02T05:14:24.510 回答
0

我在我的应用程序中使用以下代码从服务器获取最后修改日期

lastModifiedStringFromServer = [[responseForDateFromServer allHeaderFields] objectForKey:@"Last-Modified"];

标头字段及其值采用 NSDictionary 格式。因此我们必须使用 objectForKey 来获取值。

于 2013-03-25T09:21:30.587 回答