If-Range
Uso
Los clientes usan If-Range al reanudar una descarga parcial o al obtener un rango de bytes concreto de un recurso conseguido con anterioridad. La cabecera lleva como validador un valor ETag o una fecha Last-Modified. Solo se permite una de las dos formas por solicitud.
La diferencia clave con If-Match está en lo que ocurre cuando la condición falla. Un fallo de If-Match produce un error 412 Precondition Failed y detiene la solicitud. Un fallo de If-Range termina con éxito de forma elegante: el servidor ignora la cabecera Range y devuelve el recurso entero con un estado 200. Esto hace que If-Range sea más seguro para reanudar descargas, porque el cliente siempre recibe datos utilizables.
Una solicitud condicional con If-Range requiere una cabecera Range en la misma solicitud. Sin una cabecera Range, el servidor ignora If-Range por completo.
entity-tag
Un valor ETag recibido previamente del servidor. El valor es una cadena entre comillas y debe ser un validador fuerte: los ETags débiles con el prefijo W/ no se admiten en If-Range.
If-Range: "abc123"
HTTP-date
Una marca de tiempo Last-Modified en el formato de fecha HTTP estándar. El servidor compara esa fecha con la fecha de modificación actual del recurso.
If-Range: Wed, 01 Jun 2022 08:00:00 GMT
Nota
Una cabecera If-Range lleva un ETag o una fecha. No se permiten ambas formas en la misma solicitud.
Ejemplo
Un cliente descargó anteriormente parte de un archivo grande y recibió un ETag con la respuesta inicial. Para reanudar la descarga a partir del byte 1048576, el cliente envía tanto la cabecera Range como una cabecera If-Range con el ETag almacenado. Si el archivo no ha cambiado, el servidor responde con 206 Partial Content.
GET /releases/archive.tar.gz HTTP/1.1
Host: cdn.example.re
Range: bytes=1048576-
If-Range: "a1b2c3d4e5"
Cuando el recurso ha cambiado desde la descarga inicial, el ETag ya no coincide. El servidor descarta el Range y responde con el archivo completo y un estado 200.
HTTP/1.1 200 OK
Content-Length: 52428800
ETag: "f6g7h8i9j0"
Un validador basado en fecha funciona del mismo modo. Esta solicitud reanuda la descarga solo si el archivo no se ha modificado desde la marca de tiempo indicada.
GET /data/export.csv HTTP/1.1
Host: api.example.re
Range: bytes=524288-
If-Range: Sat, 15 Feb 2025 12:00:00 GMT