Aller au contenu principal

2. Notational Conventions and Generic Grammar (Conventions de Notation et Grammaire Générique)

2.1 Augmented BNF (BNF Augmenté)

Tous les mécanismes spécifiés dans ce document sont décrits à la fois en prose et dans une forme de Backus-Naur augmentée (Augmented Backus-Naur Form, BNF) similaire à celle utilisée dans RFC 822 [9]. Les implémenteurs devront être familiers avec cette notation pour comprendre cette spécification. Le BNF augmenté comprend les constructions suivantes :

name = definition Le nom d'une règle est simplement le nom lui-même (sans aucun < et > environnant) et est séparé de sa définition par le caractère égal =. Les espaces sont significatifs uniquement dans l'indentation des lignes de continuation utilisées pour indiquer une définition de règle s'étendant sur plusieurs lignes. Certaines règles de base sont en majuscules, telles que SP, LWS, HT, CRLF, DIGIT, ALPHA, etc. Les chevrons sont utilisés dans les définitions chaque fois que leur présence facilite la distinction de l'utilisation d'un nom de règle.

"literal" Les guillemets entourent le texte littéral. Sauf indication contraire, le texte n'est pas sensible à la casse.

rule1 | rule2 Les éléments séparés par une barre verticale ("|") sont des alternatives, par exemple, "yes | no" acceptera yes ou no.

(rule1 rule2) Les éléments entre parenthèses sont traités comme un seul élément. Ainsi, "(elem (foo | bar) elem)" permet les séquences de jetons "elem foo elem" et "elem bar elem".

*rule Le caractère "*" précédant un élément indique une répétition. La forme complète est "<n>*<m>element" indiquant au moins <n> et au maximum <m> occurrences de l'élément. Les valeurs par défaut sont 0 et l'infini, donc "*(element)" permet n'importe quel nombre, y compris zéro ; "1*element" nécessite au moins un ; "1*2element" permet un ou deux.

[rule] Les crochets entourent des éléments optionnels ; "[foo bar]" est équivalent à "*1(foo bar)".

N rule Répétition spécifique : "<n>(element)" est équivalent à "<n>*<n>(element)" ; c'est-à-dire exactement <n> occurrences de (element). Ainsi, 2DIGIT est un nombre à 2 chiffres et 3ALPHA est une chaîne de trois caractères alphabétiques.

#rule Une construction "#" est définie, similaire à "*", pour définir des listes d'éléments. La forme complète est "<n>#<m>element" indiquant au moins <n> et au maximum <m> éléments, chacun séparé par une ou plusieurs virgules (",") et un espace blanc linéaire (Linear White Space, LWS) optionnel. Cela rend très simple la forme habituelle des listes ; une règle telle que :

( *LWS element *( *LWS "," *LWS element ))

peut être affichée comme :

1#element

Partout où cette construction est utilisée, les éléments nuls sont autorisés, mais ne comptent pas dans le nombre d'éléments présents. C'est-à-dire que "(element), , (element)" est autorisé, mais ne compte que pour deux éléments. Par conséquent, lorsqu'au moins un élément est requis, au moins un élément non nul doit (MUST) être présent. Les valeurs par défaut sont 0 et l'infini, donc "#element" permet n'importe quel nombre, y compris zéro ; "1#element" nécessite au moins un ; "1#2element" permet un ou deux.

; comment Un point-virgule, partout sur une ligne, commence un commentaire qui se poursuit jusqu'à la fin de cette ligne. Il s'agit d'une manière simple d'inclure dans les spécifications sans faire formellement partie du BNF augmenté.

implied *LWS Sauf indication contraire, l'espace blanc linéaire (LWS) dans la grammaire peut être inclus entre deux jetons (token, séparateur) adjacents quelconques, et entre les séparateurs dans certaines règles (telles que "*", "|" ou "#"). Cette règle *LWS implicite ne devrait pas produire d'espace blanc supplémentaire dans les constructions HTTP, car de nombreuses implémentations utilisent l'espace blanc comme séparateur entre les lignes de requête et les champs d'en-tête génériques afin de pouvoir analyser rapidement les messages.

2.2 Basic Rules (Règles de Base)

Les règles suivantes sont utilisées tout au long de cette spécification pour décrire les constructions d'analyse de base. Le jeu de caractères US-ASCII est défini par ANSI X3.4-1986 [21].

OCTET          = <any 8-bit sequence of data>
CHAR = <any US-ASCII character (octets 0 - 127)>
UPALPHA = <any US-ASCII uppercase letter "A".."Z">
LOALPHA = <any US-ASCII lowercase letter "a".."z">
ALPHA = UPALPHA | LOALPHA
DIGIT = <any US-ASCII digit "0".."9">
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
CR = <US-ASCII CR, carriage return (13)>
LF = <US-ASCII LF, linefeed (10)>
SP = <US-ASCII SP, space (32)>
HT = <US-ASCII HT, horizontal-tab (9)>
<"> = <US-ASCII double-quote mark (34)>

HTTP/1.1 définit la séquence d'octets comme l'unité d'analyse de base des éléments de protocole. Les règles de syntaxe des paramètres de protocole sont données sous forme d'ABNF, comme décrit dans la section 2.1, en utilisant les règles de base suivantes.

CRLF           = CR LF
LWS = [CRLF] 1*( SP | HT )
TEXT = <any OCTET except CTLs,
but including LWS>

La règle LWS définit l'espace blanc linéaire (Linear White Space), qui peut apparaître entre le contenu du champ et les séparateurs ; il est utilisé pour plier sur plusieurs lignes sans briser la sémantique du champ. Toutes les valeurs de champ d'en-tête HTTP/1.1 peuvent être pliées sur plusieurs lignes en plaçant au moins un SP ou HT avant tout LWS.

De nombreuses valeurs de champ d'en-tête HTTP/1.1 consistent en des mots (tokens), des séparateurs et des chaînes entre guillemets. Ces éléments sont séparés par des caractères SP ou HT.

token          = 1*<any CHAR except CTLs or separators>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT

Les commentaires peuvent être inclus dans certains champs d'en-tête HTTP. Le texte autorisé dans un commentaire est défini par la règle comment.

comment        = "(" *( ctext | quoted-pair | comment ) ")"
ctext = <any TEXT excluding "(" and ")">

Une chaîne entre guillemets (quoted-string) est traitée comme un seul mot. Le texte autorisé dans une chaîne entre guillemets est défini par la règle qdtext.

quoted-string  = ( <"> *(qdtext | quoted-pair ) <"> )
qdtext = <any TEXT except <">>

Le mécanisme de citation de caractère unique permet d'inclure n'importe quel CHAR dans les constructions de chaîne entre guillemets et de commentaires.

quoted-pair    = "\" CHAR