aggiornamento: ha scritto la risposta in modo diverso e più chiaro
Ho una soluzione che funziona senza modificare il protocollo HTTP corrente. Mi piacerebbe vedere una implementazione di questo.
Invece di dire al server il nostro Etag CHIEDIAMO al server del suo Etag e lo confrontiamo con quello che abbiamo già.
Pseudo codice:
If (file_not_in_cache)
{
page=http_get_request();
page.display();
page.put_in_cache();
}
else
{
page=load_from_cache();
client_etag=page.extract_etag();
server_etag=http_HEAD_request().extract_etag();
//Instead of saying "my etag is xyz",
//the client says: what is YOUR etag, server?"
if (server_etag==client_etag)
{
page.display();
}
else
{
page.remove_from_cache();
page=http_get_request();
page.display();
page.put_in_cache();
}
}
Esempio di conversazione HTTP con soluzione 1:
Cliente:
HEAD /posts/46328
host: security.stackexchange.com
Server:
HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
ETag: "ABCDE"
Content-Type: text/html
Content-Length: 131
Caso 1, il client ha un etag identico:
Connection closes, client loads page from cache.
Caso 2, il client ha un etag di corrispondenza errata:
GET...... //and a normal http conversation begins.
Modifica: Vale la pena notare che c'è un sovraccarico minore, il server deve inviare l'intestazione HTTP due volte: una volta in risposta all'HEAD e una volta in risposta al GET. Una soluzione teorica per questo è la modifica del protocollo HTTP e l'aggiunta di un nuovo metodo che richiede il contenuto senza intestazione. Quindi il client richiede solo l'HEAD e quindi solo il contenuto, se gli etags non corrispondono.
Modifica 2: ho seguito il consiglio di makerofthings7 e l'ho postato come una domanda sullo stackoverflow .