2. Unités de plage
Selon la structure inhérente au type de média d'une représentation, celle-ci peut être découpée en sous-plages suivant différentes unités structurelles. Cette « unité de plage » sert dans le champ d'en-tête de réponse Accept-Ranges (section 2.3) à annoncer la prise en charge des requêtes de plage, dans le champ d'en-tête de requête Range (section 3.1) à délimiter les parties d'une représentation qui sont demandées, et dans le champ d'en-tête de charge utile Content-Range (section 4.2) à décrire la partie d'une représentation qui est transférée.
range-unit = bytes-unit / other-range-unit
2.1 Plages d'octets
Les données d'une représentation étant transférées dans des charges utiles sous forme d'une séquence d'octets, une plage d'octets constitue une sous-structure pertinente pour toute représentation transférable via HTTP (section 3 de [RFC7231]). L'unité de plage "bytes" sert à exprimer des sous-plages de la séquence d'octets des données.
bytes-unit = "bytes"
Une requête de plage d'octets peut spécifier une plage unique d'octets ou un ensemble de plages au sein d'une même représentation.
byte-ranges-specifier = bytes-unit "=" byte-range-set
byte-range-set = 1#( byte-range-spec / suffix-byte-range-spec )
byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
first-byte-pos = 1*DIGIT
last-byte-pos = 1*DIGIT
La valeur first-byte-pos d'une byte-range-spec donne le décalage du premier octet d'une plage. La valeur last-byte-pos donne le décalage du dernier octet de la plage, c'est-à-dire que les positions d'octets spécifiées sont incluses. Les décalages d'octets commencent à zéro.
Exemples de valeurs de byte-ranges-specifier :
-
Les 500 premiers octets (décalages d'octets 0-499 inclus) :
bytes=0-499 -
Les 500 octets suivants (décalages d'octets 500-999 inclus) :
bytes=500-999
Une byte-range-spec est invalide si la valeur last-byte-pos est présente et inférieure à first-byte-pos.
Un client peut limiter le nombre d'octets demandés sans connaître la taille de la représentation sélectionnée. Si la valeur last-byte-pos est absente, ou si elle est supérieure ou égale à la longueur courante des données de la représentation, la plage d'octets est interprétée comme le reste de la représentation (le serveur remplace alors la valeur de last-byte-pos par la longueur courante de la représentation sélectionnée moins un).
Un client peut demander les N derniers octets de la représentation sélectionnée au moyen d'une suffix-byte-range-spec.
suffix-byte-range-spec = "-" suffix-length
suffix-length = 1*DIGIT
Si la représentation sélectionnée est plus courte que la suffix-length spécifiée, la représentation entière est utilisée.
Autres exemples, en supposant une représentation d'une longueur de 10000 :
-
Les 500 derniers octets (décalages d'octets 9500-9999 inclus) :
bytes=-500oubytes=9500- -
Uniquement le premier et le dernier octet (octets 0 et 9999) :
bytes=0-0,-1 -
Autres spécifications valides (mais non canoniques) des 500 octets suivants (décalages d'octets 500-999 inclus) :
bytes=500-600,601-999
bytes=500-700,601-999
Si un byte-range-set valide comprend au moins une byte-range-spec dont la first-byte-pos est inférieure à la longueur courante de la représentation, ou au moins une suffix-byte-range-spec dont la suffix-length n'est pas nulle, alors ce byte-range-set est satisfaisable. Sinon, le byte-range-set n'est pas satisfaisable.
Dans la syntaxe des plages d'octets, first-byte-pos, last-byte-pos et suffix-length sont exprimés en nombre décimal d'octets. Comme la longueur d'une charge utile n'a pas de limite prédéfinie, les destinataires doivent s'attendre à des nombres décimaux potentiellement très grands et empêcher les erreurs d'analyse dues à un débordement de conversion en entier (MUST).
2.2 Autres unités de plage
Les unités de plage sont destinées à être extensibles. Les nouvelles unités de plage devraient être enregistrées auprès de l'IANA, comme défini à la section 5.1.
other-range-unit = token
2.3 Accept-Ranges
Le champ d'en-tête "Accept-Ranges" permet à un serveur d'indiquer qu'il prend en charge les requêtes de plage pour la ressource cible.
Accept-Ranges = acceptable-ranges
acceptable-ranges = 1#range-unit / "none"
Un serveur d'origine qui prend en charge les requêtes de plage d'octets pour une ressource cible donnée peut envoyer Accept-Ranges: bytes pour indiquer les unités de plage prises en charge (MAY). Un client peut générer des requêtes de plage sans avoir reçu ce champ d'en-tête pour la ressource concernée (MAY). Les unités de plage sont définies à la section 2.
Un serveur qui ne prend en charge aucun type de requête de plage pour la ressource cible peut envoyer Accept-Ranges: none pour conseiller au client de ne pas tenter de requête de plage (MAY).