3. Stockage des réponses dans les caches (Storing Responses in Caches)
Un cache NE DOIT PAS (MUST NOT) stocker une réponse à une requête, sauf si :
- La méthode de requête est comprise par le cache et définie comme pouvant être mise en cache, et
- le code d'état de la réponse est compris par le cache, et
- la directive de cache "no-store" (voir Section 5.2) n'apparaît pas dans les champs d'en-tête de la requête ou de la réponse, et
- la directive de réponse "private" (voir Section 5.2.2.6) n'apparaît pas dans la réponse, si le cache est partagé, et
- le champ d'en-tête Authorization (voir Section 4.2 de
[RFC7235]) n'apparaît pas dans la requête, si le cache est partagé, sauf si la réponse l'autorise explicitement (voir Section 3.2), et - la réponse satisfait l'une des conditions suivantes :
- contient un champ d'en-tête Expires (voir Section 5.3), ou
- contient une directive de réponse max-age (voir Section 5.2.2.8), ou
- contient une directive de réponse s-maxage (voir Section 5.2.2.9) et le cache est partagé, ou
- contient une Extension Cache Control (voir Section 5.2.3) qui autorise sa mise en cache, ou
- a un code d'état défini comme pouvant être mis en cache par défaut (voir Section 4.2.2), ou
- contient une directive de réponse public (voir Section 5.2.2.5).
Notez que l'une quelconque des exigences énumérées ci-dessus peut être remplacée par une extension de contrôle de cache ; voir Section 5.2.3.
Dans ce contexte, un cache a « compris » une méthode de requête ou un code d'état de réponse s'il le reconnaît et implémente tout le comportement lié à la mise en cache spécifié.
Notez qu'en fonctionnement normal, certains caches ne stockeront pas une réponse qui n'a ni validateur de cache ni temps d'expiration explicite, car de telles réponses ne sont généralement pas utiles à stocker. Cependant, les caches ne sont pas interdits de stocker de telles réponses.
3.1. Stockage des réponses incomplètes (Storing Incomplete Responses)
Un message de réponse est considéré comme complet lorsque tous les octets indiqués par le cadre du message ([RFC7230]) ont été reçus avant la fermeture de la connexion. Lorsque la méthode de requête est GET, le code d'état de la réponse est 200 (OK), et la totalité de la section d'en-tête de la réponse a été reçue, un cache PEUT (MAY) stocker un corps de message de réponse incomplet si l'entrée du cache est enregistrée comme incomplète. De même, une réponse 206 (Partial Content) PEUT (MAY) être stockée comme s'il s'agissait d'une entrée de cache 200 (OK) incomplète. Un cache NE DOIT CEPENDANT PAS (MUST NOT) stocker des réponses incomplètes ou à contenu partiel s'il ne prend pas en charge les champs d'en-tête Range et Content-Range ou ne comprend pas les unités de plage utilisées dans ces champs.
Un cache PEUT (MAY) compléter une réponse incomplète stockée en effectuant une requête de plage ultérieure ([RFC7233]) et en combinant la réponse réussie avec l'entrée stockée, comme défini à la Section 3.3. Un cache NE DOIT PAS (MUST NOT) utiliser une réponse incomplète pour répondre aux requêtes, à moins que la réponse n'ait été complétée ou que la requête soit partielle et spécifie une plage entièrement contenue dans la réponse incomplète. Un cache NE DOIT PAS (MUST NOT) envoyer une réponse partielle à un client sans la marquer explicitement comme telle avec le code d'état 206 (Partial Content).
3.2. Stockage des réponses aux requêtes authentifiées (Storing Responses to Authenticated Requests)
Un cache partagé NE DOIT PAS (MUST NOT) utiliser une réponse en cache à une requête avec un champ d'en-tête Authorization (Section 4.2 de [RFC7235]) pour satisfaire une requête ultérieure, à moins qu'une directive de cache autorisant le stockage de telles réponses ne soit présente dans la réponse.
Dans cette spécification, les directives de réponse Cache-Control suivantes (Section 5.2.2) ont un tel effet : must-revalidate, public et s-maxage.
Notez que les réponses en cache contenant les directives de réponse "must-revalidate" et/ou "s-maxage" ne doivent pas être fournies comme obsolètes par les caches partagés (Section 4.2.4). En particulier, une réponse contenant soit "max-age=0, must-revalidate", soit "s-maxage=0" ne peut pas être utilisée pour satisfaire une requête ultérieure sans la revalider auprès du serveur d'origine.
3.3. Combinaison de contenus partiels (Combining Partial Content)
Une réponse ne peut transporter qu'une représentation partielle si la connexion a été fermée prématurément ou si la requête a utilisé un ou plusieurs spécificateurs de plage ([RFC7233]). Après de telles transmissions multiples, un cache peut avoir reçu plusieurs plages de la même représentation. Un cache PEUT (MAY) combiner ces plages en une seule réponse stockée et réutiliser cette réponse pour satisfaire les requêtes ultérieures, si elles partagent toutes le même validateur fort et que le cache satisfait aux exigences client de la Section 4.3 de [RFC7233].
Lors de la combinaison de la nouvelle réponse avec une ou plusieurs réponses stockées, un cache DOIT (MUST) :
- supprimer tous les champs d'en-tête Warning dans la réponse stockée ayant un code d'avertissement 1xx (voir Section 5.5) ;
- conserver tous les champs d'en-tête Warning dans la réponse stockée ayant un code d'avertissement 2xx ; et
- utiliser les autres champs d'en-tête fournis dans la nouvelle réponse, à l'exception de Content-Range, pour remplacer toutes les instances des champs d'en-tête correspondants dans la réponse stockée.