206 Partial Content
Utilisation
Le code de statut 206 Partial Content est renvoyé en réponse à une requête contenant un ou plusieurs en-têtes Range. Un en-tête Range précise quelles parties du document le serveur renvoie, et le serveur livre éventuellement les données sous forme de document multipart.
Lorsqu’un seul en-tête Range est spécifié, l’en-tête Content-Length reflète la taille de la plage transférée (le contenu), l’en-tête Content-Type correspond au type du document, et un en-tête Content-Range indique quelle section est incluse. La taille complète du document figure dans le champ complete-length de l’en-tête Content-Range. Les données demandées suivent dans le corps du message.
Pour plusieurs plages, l’en-tête Content-Length indique le nombre total d’octets du corps du message. L’en-tête Content-Type initial vaut multipart/byteranges, et les paires Content-Type / Content-Range suivantes décrivent chaque plage. Le serveur n’inclut pas de champ Content-Range dans l’en-tête initial.
Dans les requêtes à plages multiples, le serveur fusionne éventuellement les plages qui se chevauchent ou celles séparées par un intervalle plus petit que le surcoût lié à l’envoi d’une partie supplémentaire. Cela se fait par souci d’efficacité : recevoir moins de parties que demandé n’indique donc pas nécessairement une erreur. L’inverse n’est pas vrai : un serveur ne génère pas plusieurs parties lorsqu’une seule plage est demandée.
Au-delà du nombre de plages, l’ordre des parties n’est pas garanti non plus. Un serveur s’efforce d’envoyer les plages dans l’ordre demandé, mais ce n’est pas toujours réalisable.
Quel que soit le nombre de plages demandées, l’en-tête Content-Range inclut la taille totale de la ressource. Lorsque cette taille est inconnue au moment de la réponse, un astérisque tient lieu de valeur.
Lorsque le serveur ne peut pas renvoyer les plages demandées, un code de statut 416 est renvoyé. Certains serveurs renvoient à la place un 200 avec le document entier dans le corps du message.
Exemple de récupération d’une plage unique
Le client demande un bloc de données à l’intérieur d’un fichier vidéo à l’aide de l’en-tête Range. Le serveur renvoie la plage demandée, en indiquant une vidéo encodée en MP4.
Requête
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=25000-75000
Réponse
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/100000
<50,001 bytes of video data>
Réponse alternative lorsque la taille totale est inconnue
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/*
<50,001 bytes of video data>
Exemple de récupération de plages multiples
Lorsque plusieurs plages sont demandées, le client précise chaque plage dans la requête. Les plages sont placées sur des lignes différentes ou séparées par des virgules sur une même ligne. Le serveur utilise une chaîne de séparation pour marquer la frontière entre les parties de plage.
Requête
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=100-250, 1500-2000, 5000-5200
Réponse
HTTP/1.1 206 Partial Content
Content-Length: 1115
Content-Type: multipart/byteranges; boundary=range_sep
--range_sep
Content-Type: video/mp4
Content-Range: bytes 100-250/75000
<151 bytes of video data as the first range>
--range_sep
Content-Type: video/mp4
Content-Range: bytes 1500-2000/75000
<501 bytes of video data as the second range>
--range_sep
Content-Type: video/mp4
Content-Range: bytes 5000-5200/75000
<201 bytes of video data as the third range>
--range_sep--
Téléchargements reprenables
La réponse 206 Partial Content rend possibles les téléchargements reprenables. Lorsqu’un transfert est interrompu, le client envoie une nouvelle requête avec un en-tête Range débutant au dernier octet reçu. Le serveur renvoie les données restantes dans une réponse 206 plutôt que de retransmettre la ressource entière. Les gestionnaires de téléchargement et des outils comme curl —continue-at - reposent sur ce mécanisme.
Références de code
.NET
HttpStatusCode.PartialContent
Rust
http::StatusCode::PARTIAL_CONTENT
Rails
:partial_content
Go
http.StatusPartialContent
Symfony
Response::HTTP_PARTIAL_CONTENT
Python3.5+
http.HTTPStatus.PARTIAL_CONTENT
Java
java.net.HttpURLConnection.HTTP_PARTIAL
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_PARTIAL_CONTENT
Angular
@angular/common/http/HttpStatusCode.PartialContent