Tengo un pequeño problema con el almacenamiento en caché de solicitudes mediante conexiones asíncronas NSURLConnection en el iPhone. No sé si he entendido algo de manera incorrecta, o si cacao está haciendo lo contrario a lo que se supone que debe hacer ...NSURLConnection, NSURLRequest y almacenamiento en memoria caché remota
La documentación para NSURLRequest dice que:
NSURLRequestReloadIgnoringLocalCacheData
Especifica que los datos para la carga de URL deben cargarse desde la fuente de origen. No se deben usar datos de caché existentes para satisfacer una solicitud de carga de URL.
y:
NSURLRequestReloadIgnoringLocalAndRemoteCacheData
Especifica que no sólo se debe ignorar los datos de la memoria caché local, pero que los proxies y otros productos intermedios deben ser instruidos para no tener en cuenta sus cachés la medida en que el protocolo permite .
Ahora, si envío un NSURLRequest con NSURLRequestReloadIgnoringLocalCacheData (que se supone hacer caso omiso de caché local, pero el uso de caché remota si está disponible), las cabeceras que se envían son:
GET /dashboard HTTP/1.1 User-Agent: XBlip1.0 CFNetwork/422.15.2 Darwin/9.6.0 (i386) (iMac8%2C1) X-Blip-Api: 0.02 Accept: application/json Authorization: Basic (...) Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: keep-alive Host: api.blip.pl
y el estado se 200 OK Pero si uso NSURLRequestReloadIgnoringLocalAndRemoteCacheData, que se supone hacer caso omiso de las cachés locales y remotos, como su nombre indica, se añade un encabezado adicional:
If-None-Match: "d751713988987e9331980363e24189ce"
Y la respuesta es 304 Not Modified. He comprobado el RFC HTTP, y por "If-None-Match" se dice que:
Si cualquiera de las etiquetas de la entidad coincide con la etiqueta entidad de la entidad que se habría devuelto en la respuesta a una solicitud GET similar (sin el encabezado If-None-Match) en ese recurso, (...) entonces el servidor NO DEBE realizar el método solicitado (...) En cambio, si el método de solicitud fue GET o HEAD, el servidor DEBERÍA responder con una respuesta 304 (Not Modified)
Así que parece que si uso NSURLRequestReloadIgnoringLocalAndRemoteCacheData, en lugar de ignorar la caché remota, cacao le dice al servidor remoto explícitamente que debe usa memoria caché remota, y si uso NSURLRequestReloadIgnoringLocalCacheData, no agrega esa línea y en efecto la memoria caché remota no se usa.
¿Qué está pasando exactamente aquí? ¿Me perdí algo, o Cocoa está configurando un encabezado incorrecto?