Aller au contenu principal

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=-500 ou bytes=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).