Manejar el nombre del campo del encabezado HTTP en iOS / OSX

Como sabemos, los nombres de encabezado HTTP no distinguen mayúsculas y minúsculas, lo cual se especifica en RFC2616 .

Sin embargo, descubrí que todos los frameworks populares de iOS / OSX, como ASIHTTRequest , AFNetworking , RestKit , testingn si existe o no un campo de encabezado con el siguiente código.

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

the responseHeaders es solo un NSDictionary. Pensé que la capa CFNetwork manejaría esto sin embargo, no se encontraron pistas. ¿Quizás esta es una convención en el mundo real?

En realidad, el método -[NSHTTPURLResponse allHeaderFields] devuelve una instancia NSDictionary insensible a mayúsculas y minúsculas. Esto no tiene nada que ver con la function _CFCapitalizeHeader que se eliminó en las versiones recientes de CFNetwork. Desafortunadamente, su código fuente ya no está disponible.

Aquí hay un gráfico de llamada simplificado del método allHeaderFields (OS X 10.8.3)

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

Este dictionary finalmente se devuelve como resultado del método allHeaderFields . Aquí está el aspecto del tercer parámetro que pasó a 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 

El método _keyEqual C ++ eventualmente llama a CFStringCompare con la opción kCFCompareCaseInsensitive .

Es por eso que no se preocupan por la sensibilidad de los casos de los encabezados NSHTTPURLResponse.

Es muy lamentable que este comportamiento no esté documentado. Por favor duplique el radar # 13715902 pidiendo documentation.

Encuentro la respuesta Aunque no hay documentation sobre esto. La capa CFNetwork normalizó el campo del encabezado. http://www.opensource.apple.com/source/CFNetwork/CFNetwork-129.9/HTTP/CFHTTPMessage.c el trabajo se realiza en la function __CFCapitalizeHeader.

Estoy usando el siguiente código en mi aplicación para get la última date de modificación del server

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

Los campos del encabezado y sus valores están en el formatting NSDictionary. Por lo tanto, debemos usar objectForKey para get el valor.