Aller au contenu principal

3. Stockage des réponses dans les caches

Un cache MUST NOT stocker une réponse à une quelconque requête, sauf si :

  • la méthode de la 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 du [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, soit :

    • 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 de contrôle de cache (voir Section 5.2.3) qui permet sa mise en cache, ou

    • possède 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 supplantée par une extension de contrôle de cache ; voir la 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 met en œuvre tout le comportement associé à la mise en cache qui est spécifié.

Notez qu'en fonctionnement normal, certains caches ne stockeront pas une réponse qui n'a ni validateur de cache ni date d'expiration explicite, car de telles réponses ne sont généralement pas utiles à stocker. Toutefois, il n'est pas interdit aux caches de stocker de telles réponses.

3.1. Stockage des réponses incomplètes​

Un message de réponse est considéré comme complet lorsque tous les octets indiqués par le cadrage du message ([RFC7230]) ont été reçus avant la fermeture de la connexion. Si la méthode de la requête est GET, que le code d'état de la réponse est 200 (OK) et que la totalité de la section d'en-tête de la réponse a été reçue, un cache MAY stocker un corps de message de réponse incomplet si l'entrée de cache est enregistrée comme incomplète. De même, une réponse 206 (Partial Content) MAY être stockée comme s'il s'agissait d'une entrée de cache 200 (OK) incomplète. Toutefois, un cache 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 s'il ne comprend pas les unités de plage utilisées dans ces champs.

Un cache 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 MUST NOT utiliser une réponse incomplète pour répondre à des requêtes, sauf si la réponse a été rendue complète ou si la requête est partielle et spécifie une plage entièrement comprise dans la réponse incomplète. Un cache MUST NOT envoyer une réponse partielle à un client sans la marquer explicitement comme telle à l'aide du code d'état 206 (Partial Content).

3.2. Stockage des réponses aux requêtes authentifiées​

Un cache partagé MUST NOT utiliser une réponse mise en cache à une requête comportant un champ d'en-tête Authorization (Section 4.2 du [RFC7235]) pour satisfaire une requête ultérieure quelconque, sauf si une directive de cache autorisant le stockage de telles réponses est présente dans la réponse.

Dans cette spécification, les directives de réponse Cache-Control suivantes (Section 5.2.2) ont cet effet : must-revalidate, public et s-maxage.

Notez que les réponses mises en cache qui contiennent les directives de réponse « must-revalidate » et/ou « s-maxage » ne sont pas autorisées à être servies périmées (Section 4.2.4) par les caches partagés. En particulier, une réponse comportant soit « max-age=0, must-revalidate », soit « s-maxage=0 » ne peut pas être utilisée pour satisfaire une requête ultérieure sans avoir été revalidée sur le serveur d'origine.

3.3. Combinaison de contenus partiels​

Une réponse peut ne transférer qu'une représentation partielle si la connexion s'est fermée prématurément ou si la requête a utilisé un ou plusieurs spécificateurs Range ([RFC7233]). Après plusieurs de ces transferts, un cache peut avoir reçu plusieurs plages de la même représentation. Un cache MAY combiner ces plages en une seule réponse stockée et réutiliser cette réponse pour satisfaire des requêtes ultérieures, si elles partagent toutes le même validateur fort et si le cache respecte les exigences relatives aux clients de la Section 4.3 du [RFC7233].

Lorsqu'il combine la nouvelle réponse avec une ou plusieurs réponses stockées, un cache MUST :

  • supprimer tous les champs d'en-tête Warning de la réponse stockée dont le warn-code est 1xx (voir Section 5.5) ;

  • conserver tous les champs d'en-tête Warning de la réponse stockée dont le warn-code est 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 occurrences des champs d'en-tête correspondants dans la réponse stockée.