actualización: escribió la respuesta de manera diferente y más clara
Tengo una solución que funciona sin modificar el protocolo HTTP actual. Me encantaría ver una implementación de esto.
En lugar de decirle al servidor nuestro Etag le preguntamos al servidor por su Etag , y lo comparamos con el que ya tenemos.
Pseudo código:
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();
}
}
Ejemplo de conversación HTTP con solución 1:
Cliente:
HEAD /posts/46328
host: security.stackexchange.com
Servidor:
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, el cliente tiene un etag idéntico:
Connection closes, client loads page from cache.
Caso 2, el cliente tiene una etiqueta no coincidente:
GET...... //and a normal http conversation begins.
Editar: Vale la pena señalar que hay una pequeña sobrecarga, el servidor tiene que enviar el encabezado HTTP dos veces: una vez en respuesta a HEAD y una vez en respuesta a GET. Una solución teórica para esto es modificar el protocolo HTTP y agregar un nuevo método que solicite contenido sin encabezado. Luego, el cliente solo solicitará la CABEZA, y luego el contenido, si las discrepancias etags no coinciden.
Edición 2: He seguido el consejo de makerofthings7 y publiqué esto como una pregunta sobre stackoverflow .