RFC du protocole HTTP : Conventions de notation


2. Conventions de notation et Grammaire générique


2.1 BNF étendue

Tous les mécanismes évoqués sont décrits en prose et sous forme Backus-Naur étendue (BNF) similaire à celle utilisée dans la RFC 822 [7]. Les développeurs devront être familiarisés avec cette notation afin de comprendre cette spécification. La notation Backus-Naur comprend les allégations suivantes :

nom = définition

Le nom d'une règle est le nom lui-même (sans "<" ni ">" englobants) et est séparé de sa définition par le symbole "=". Le caractère espace n'a de signification que lorsqu'un retrait indique qu'une définition s'étend sur plusieurs lignes. Certaines règles de base sont en majuscules, comme SP, LWS, HT, CRLF, DIGIT, ALPHA, etc. Les ouvertures et fermetures "<" et ">" ne sont utilisées que lorsqu'une discrimination des règles est indispensable à l'intérieur d'une définition.

"literal"

Un texte littéral est entre doubles guillemets. Sauf mention contraire, la casse du texte n'est pas considérée.

règle1 | règle2

Les éléments séparés par une barre ("I") constituent une alternative, ex., "oui | non" acceptera "oui" ou "non".

(règle1 règle2)

Les éléments à l'intérieur de parenthèses sont considérés comme un seul élément. Ainsi, "(elem (foo | bar) elem)" permet les séquence "elem foo elem" et "elem bar elem".

*règle

Le caractère "*" précédent un élément indique sa répétition. La forme complète de cette notation est "<n>* <m>element" indiquant au moins <n> et au plus <m> occurrences de "element". Les valeurs par défaut sont 0 et "infini". la syntaxe "*(element)" signifie donc tout nombre d'occurrences y compris 0; "1*element" précise au moins une occurrence; et "1*2element" précise une ou deux occurrences.

[règle]

Les crochets précisent un élément optionnel; "[foo bar]" vaut pour "*1(foo bar)".

Nrègle

Répétition précise: "<n>(element)" est équivalente à "<n>*<n>(element)"; c'est à dire, exactement <n> occurrences de (element). Ainsi 2DIGIT est un nombre de 2-digits, et 3ALPHA une chaîne de 3 caractères alphabétiques.

#règle

Une syntaxe "#" est utilisée, comme pour la syntaxe "*", pour définir des listes d'éléments. La forme complète en est "<n># <m>element" indiquant au moins <n> et au plus <m> elements, chacun séparé par une ou plusieurs virgules (",") et des espaces optionnels (LWS). Ceci rend la forme des listes très lisible; une règle du type "( *LWS element *( *LWS "," *LWS element ))" peut être vue comme "1#element". Lorsque cette construction est utilisée, les éléments vides sont utilisés, mais ne contribue pas au comptage des éléments présents. De ce fait, "(element), , (element)" est permis, mais compte comme deux éléments. Toutefois, dans les cas ou un élément au moins est requis, cet élément doit être non nul. Les valeurs par défaut sont 0 et "infini" et donc "#(element)" vaut pour tous les éléments y compris 0; "1#element" vaut pour au moins un; et "1#2element" permet un ou deux éléments.

; commentaire

Un point virgule, à distance d'un texte de règle instaure un début de commentaire qui va jusqu'au bout de la ligne. C'est un moyen pratique d'insérer des remarques ou annotations en cours de spécification.

*LWS implicite

La grammaire décrite par cette spécification est basée sur le "mot". Sauf mention contraire, tout nombre d'espaces (LWS) peut être inséré entre deux mots adjacents ou "token", et entre un "token" et un délimiteur (tspecials), sans changer l'interprétation. Il doit exister au moins un délimiteur (tspecials) entre deux mots, au risque de les voir interprétés comme un seul. Malgré tout, les constructions HTTP tendront à utiliser la "forme commune", certaines implémentations ne savent traiter autre chose que cette forme.

2.2 Règles de base

Les règles de base suivantes seront utilisées tout au long de ce document dans les séquences de recherche. La table de caractères ASCII-US est définie par [17].

OCTET       = [toute donnée codée sur 8 bits]
CHAR        = [tout caractère ASCII-US (0 à 127)>
UPALPHA     = [Tout caractère alphabétique ASCII-US majuscule "A".."Z"]
LOALPHA     = [Tout caractère alphabétique ASCII-US minuscule "a".."z"]
ALPHA       = UPALPHA | LOALPHA
DIGIT       = [tout digit ASCII-US "0".."9"]
CTL         = [Tous caractère de contrôle ASCII-US (0 à 31) et DEL (127)]
CR          = [CR ASCII-US, retour chariot (13)]
LF          = [LF ASCII-US, saut de ligne (10)]
SP          = [SP ASCCII-US, espace (32)]
HT          = [HT ASCII-US, tabulation horizontale (9)]
<">         = [double guillemet ASCII-US (34)]

HTTP/1.0 définit la séquence CR LF comme marqueur de fin de ligne pour tous les éléments excepté le corps de l'entité (voir Appendice B pour les tolérances). La fin de ligne à l'intérieur d'un corps d'entité dépend de son média, comme décrit en Section 3.6.

CRLF        = CR LF

Les en-têtes HTTP/1.0 peuvent être réparties su plusieurs lignes si chaque nouvelle ligne commence par un espace ou une tabulation horizontale. Une suite d'espace, même sur plusieurs lignes équivaut à un espace simple.

LWS		=	[CRLF] 1*( SP | HT )

Cependant les en-têtes multilignes ne sont pas acceptées par toutes les applications, et doivent de préférence être évitées lors d'un codage HTTP/1.0.

La règle TEXT est utilisée pour décrire des informations descriptives qui ne sont pas sensées être interprétées. Les mots d'un élément *TEXT peuvent contenir d'autres caractères que ceux de la table ASCII-US stricto sensu.

TEXT                  = [tout OCTET sauf CTL, hormis LWS qui reste
                        autorisé]

Les récepteurs d'un élément TEXT d'une en-tête contenant des octets hors de la table ASCII-US supposeront qu'il s'agit de caractères ISO-8859-1.

Les caractères hexadécimaux peuvent être utilisés dans certaines applications.

HEX                   = "A" | "B" | "C" | "D" | "E" | "F" | "a" 
                      | "b" | "c" | "d" | "e" | "f" | DIGIT 

De nombreux champs d'en-tête HTTP/1.0 sont formés de mots séparés par des espaces ou caractères spéciaux. Ces caractères doivent être entre guillemets lorsqu'ils sont utilisés à l'intérieur d'une valeur.

mot                   = token | chaîne entre guillemets

token                 = 1*[tout CHAR excepté CTLs ou tspecials]

tspecials             = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" 
                      | "\" | ["] | "/" | "[" | "]" | "?" | "=" | "{" 
                      | "}" | SP | HT

Les commentaires pourront être insérés dans les en-têtes HTTP en les entourant de parenthèses. Les commentaires ne sont permis que dans les champs contenant le mot "comment" dans leur définition. Dans tous les autres champs, les parenthèses sont interprétées comme faisant partie de l'expression.

comment              = "(" *( ctext | comment ) ")"
ctext                = [tout TEXT excepté "(" et
                        ")"]

Une chaîne sera interprétée comme un seul mot si elle est entre double guillemets.

quoted-string        = ( <"> *(qdtext) <"> )

qdtext               = [tout CHAR sauf <"> et CTL, hormis LWS qui est accepté]

L'utilisation du backslash ("\") comme séquence d'échappement d'un caractère unique n'est pas permis par le protocole HTTP/1.0



Crédits : T. Berners-Lee, MIT/LCS, R. Fielding, UC Irvine, H. Frystyk, MIT/LCS,
Traduction : V.G. FREMAUX
Edition originale : Mai 1996 / Version FR: Septembre 1997