3. Archiviazione delle risposte nelle cache
Una cache MUST NOT archiviare una risposta a qualsiasi richiesta, a meno che:
-
il metodo della richiesta sia compreso dalla cache e definito come memorizzabile in cache, e
-
il codice di stato della risposta sia compreso dalla cache, e
-
la direttiva di cache "no-store" (vedere la sezione 5.2) non compaia nei campi di intestazione della richiesta o della risposta, e
-
la direttiva di risposta "private" (vedere la sezione 5.2.2.6) non compaia nella risposta, se la cache è condivisa, e
-
il campo di intestazione Authorization (vedere la sezione 4.2 di [RFC7235]) non compaia nella richiesta, se la cache è condivisa, a meno che la risposta lo consenta esplicitamente (vedere la sezione 3.2), e
-
la risposta:
-
contenga un campo di intestazione Expires (vedere la sezione 5.3), oppure
-
contenga una direttiva di risposta max-age (vedere la sezione 5.2.2.8), oppure
-
contenga una direttiva di risposta s-maxage (vedere la sezione 5.2.2.9) e la cache sia condivisa, oppure
-
contenga un'estensione di controllo della cache (vedere la sezione 5.2.3) che ne consenta la memorizzazione, oppure
-
abbia un codice di stato definito come memorizzabile in cache per impostazione predefinita (vedere la sezione 4.2.2), oppure
-
contenga una direttiva di risposta public (vedere la sezione 5.2.2.5).
-
Si noti che uno qualsiasi dei requisiti sopra elencati può essere sostituito da un'estensione di controllo della cache; vedere la sezione 5.2.3.
In questo contesto, una cache ha "compreso" un metodo di richiesta o un codice di stato di risposta se lo riconosce e implementa tutto il comportamento specificato relativo alla memorizzazione in cache.
Si noti che, in condizioni normali, alcune cache non archiviano una risposta che non abbia né un validatore di cache né un tempo di scadenza esplicito, poiché tali risposte di solito non sono utili da archiviare. Tuttavia, alle cache non è vietato archiviare tali risposte.
3.1. Archiviazione di risposte incomplete
Un messaggio di risposta è considerato completo quando tutti gli ottetti indicati dalla strutturazione del messaggio ([RFC7230]) sono stati ricevuti prima della chiusura della connessione. Se il metodo della richiesta è GET, il codice di stato della risposta è 200 (OK) e l'intera sezione di intestazione della risposta è stata ricevuta, una cache MAY archiviare un corpo di messaggio di risposta incompleto se la voce di cache è registrata come incompleta. Analogamente, una risposta 206 (Partial Content) MAY essere archiviata come se fosse una voce di cache 200 (OK) incompleta. Tuttavia, una cache MUST NOT archiviare risposte incomplete o con contenuto parziale se non supporta i campi di intestazione Range e Content-Range, o se non comprende le unità di intervallo usate in tali campi.
Una cache MAY completare una risposta incompleta archiviata effettuando una successiva richiesta di intervallo ([RFC7233]) e combinando la risposta riuscita con la voce archiviata, come definito nella sezione 3.3. Una cache MUST NOT usare una risposta incompleta per rispondere alle richieste, a meno che la risposta sia stata completata o la richiesta sia parziale e specifichi un intervallo interamente compreso nella risposta incompleta. Una cache MUST NOT inviare una risposta parziale a un client senza contrassegnarla esplicitamente come tale usando il codice di stato 206 (Partial Content).
3.2. Archiviazione di risposte a richieste autenticate
Una cache condivisa MUST NOT usare una risposta in cache a una richiesta con un campo di intestazione Authorization (sezione 4.2 di [RFC7235]) per soddisfare qualsiasi richiesta successiva, a meno che nella risposta sia presente una direttiva di cache che consenta di archiviare tali risposte.
In questa specifica, le seguenti direttive di risposta Cache-Control (sezione 5.2.2) hanno tale effetto: must-revalidate, public e s-maxage.
Si noti che le risposte in cache che contengono le direttive di risposta "must-revalidate" e/o "s-maxage" non possono essere servite obsolete (sezione 4.2.4) dalle cache condivise. In particolare, una risposta con "max-age=0, must-revalidate" oppure "s-maxage=0" non può essere usata per soddisfare una richiesta successiva senza rivalidarla sul server di origine.
3.3. Combinazione di contenuti parziali
Una risposta potrebbe trasferire solo una rappresentazione parziale se la connessione si è chiusa prematuramente o se la richiesta ha usato uno o più specificatori Range ([RFC7233]). Dopo diversi trasferimenti di questo tipo, una cache potrebbe aver ricevuto diversi intervalli della stessa rappresentazione. Una cache MAY combinare questi intervalli in un'unica risposta archiviata e riutilizzare tale risposta per soddisfare richieste successive, se condividono tutti lo stesso validatore forte e la cache rispetta i requisiti del client nella sezione 4.3 di [RFC7233].
Quando combina la nuova risposta con una o più risposte archiviate, una cache MUST:
-
eliminare tutti i campi di intestazione Warning nella risposta archiviata con warn-code 1xx (vedere la sezione 5.5);
-
conservare tutti i campi di intestazione Warning nella risposta archiviata con warn-code 2xx; e
-
usare gli altri campi di intestazione forniti nella nuova risposta, a parte Content-Range, per sostituire tutte le istanze dei campi di intestazione corrispondenti nella risposta archiviata.