If-Range
Utilisation
Les clients utilisent If-Range lorsqu’ils reprennent un téléchargement partiel ou récupèrent une plage d’octets précise d’une ressource obtenue auparavant. L’en-tête transporte comme validateur soit une valeur d’ETag, soit une date Last-Modified. Une seule forme est autorisée par requête.
La différence essentielle avec If-Match réside dans ce qui se produit en cas d’échec de la condition. Un échec de If-Match produit une erreur 412 Precondition Failed et interrompt la requête. Un échec de If-Range aboutit en douceur : le serveur ignore l’en-tête Range et renvoie la ressource entière avec un statut 200. Cela rend If-Range plus sûr pour la reprise de téléchargement, car le client reçoit toujours des données exploitables.
Une requête conditionnelle avec If-Range exige un en-tête Range dans la même requête. Sans en-tête Range, le serveur ignore complètement If-Range.
entity-tag
Une valeur d’ETag reçue précédemment du serveur. La valeur est une chaîne entre guillemets et doit être un validateur fort : les ETags faibles préfixés par W/ ne sont pas admis dans If-Range.
If-Range: "abc123"
HTTP-date
Un horodatage Last-Modified au format de date HTTP standard. Le serveur compare cette date à la date de modification actuelle de la ressource.
If-Range: Wed, 01 Jun 2022 08:00:00 GMT
Remarque
Un en-tête If-Range transporte soit un ETag, soit une date. Les deux formes ne sont pas autorisées dans la même requête.
Exemple
Un client a précédemment téléchargé une partie d’un gros fichier et reçu un ETag avec la réponse initiale. Pour reprendre le téléchargement à partir de l’octet 1048576, le client envoie à la fois l’en-tête Range et un en-tête If-Range portant l’ETag mémorisé. Si le fichier n’a pas changé, le serveur répond par un 206 Partial Content.
GET /releases/archive.tar.gz HTTP/1.1
Host: cdn.example.re
Range: bytes=1048576-
If-Range: "a1b2c3d4e5"
Lorsque la ressource a changé depuis le téléchargement initial, l’ETag ne correspond plus. Le serveur écarte le Range et répond avec le fichier complet et un statut 200.
HTTP/1.1 200 OK
Content-Length: 52428800
ETag: "f6g7h8i9j0"
Un validateur fondé sur une date fonctionne de la même manière. Cette requête ne reprend le téléchargement que si le fichier n’a pas été modifié depuis l’horodatage indiqué.
GET /data/export.csv HTTP/1.1
Host: api.example.re
Range: bytes=524288-
If-Range: Sat, 15 Feb 2025 12:00:00 GMT