2. Notational Conventions and Generic Grammar (Notationskonventionen und Allgemeine Grammatik)
2.1 Augmented BNF (Erweiterte BNF)
Alle in diesem Dokument spezifizierten Mechanismen werden sowohl in Prosa als auch in einer erweiterten Backus-Naur-Form (Augmented Backus-Naur Form, BNF) beschrieben, ähnlich der in RFC 822 [9] verwendeten Form. Implementierer müssen mit dieser Notation vertraut sein, um diese Spezifikation zu verstehen. Die erweiterte BNF umfasst die folgenden Konstrukte:
name = definition
Der Name einer Regel ist einfach der Name selbst (ohne umschließende < und >), und er wird durch das Gleichheitszeichen = von seiner Definition getrennt. Leerzeichen sind nur bei der Einrückung von Fortsetzungszeilen bedeutsam, die verwendet werden, um eine sich über mehrere Zeilen erstreckende Regeldefinition anzuzeigen. Einige Grundregeln sind in Großbuchstaben geschrieben, wie SP, LWS, HT, CRLF, DIGIT, ALPHA usw. Spitzklammern werden in Definitionen verwendet, wenn ihre Anwesenheit hilft, die Verwendung eines Regelnamens zu unterscheiden.
"literal" Anführungszeichen umgeben literalen Text. Sofern nicht anders angegeben, wird beim Text nicht zwischen Groß- und Kleinschreibung unterschieden.
rule1 | rule2 Durch einen senkrechten Strich ("|") getrennte Elemente sind Alternativen, z.B. akzeptiert "yes | no" yes oder no.
(rule1 rule2) Elemente in Klammern werden als einzelnes Element behandelt. Daher erlaubt "(elem (foo | bar) elem)" die Token-Sequenzen "elem foo elem" und "elem bar elem".
*rule
Das Zeichen "*" vor einem Element zeigt Wiederholung an. Die vollständige Form ist "<n>*<m>element", was mindestens <n> und höchstens <m> Vorkommen des Elements anzeigt. Die Standardwerte sind 0 und unendlich, daher erlaubt "*(element)" eine beliebige Anzahl, einschließlich null; "1*element" erfordert mindestens eines; "1*2element" erlaubt eines oder zwei.
[rule] Eckige Klammern umschließen optionale Elemente; "[foo bar]" entspricht "*1(foo bar)".
N rule
Spezifische Wiederholung: "<n>(element)" entspricht "<n>*<n>(element)"; d.h. genau <n> Vorkommen von (element). Somit ist 2DIGIT eine 2-stellige Zahl, und 3ALPHA ist eine Zeichenkette aus drei alphabetischen Zeichen.
#rule
Ein Konstrukt "#" wird definiert, ähnlich wie "*", um Listen von Elementen zu definieren. Die vollständige Form ist "<n>#<m>element", was mindestens <n> und höchstens <m> Elemente anzeigt, wobei jedes durch ein oder mehrere Kommas (",") und optionales lineares Leerzeichen (Linear White Space, LWS) getrennt ist. Dies macht die übliche Form von Listen sehr einfach; eine Regel wie:
( *LWS element *( *LWS "," *LWS element ))
kann angezeigt werden als:
1#element
Überall dort, wo dieses Konstrukt verwendet wird, sind Nullelemente erlaubt, zählen aber nicht zur Anzahl der vorhandenen Elemente. Das heißt, "(element), , (element)" ist erlaubt, zählt aber nur als zwei Elemente. Daher muss (MUST) mindestens ein Nicht-Null-Element vorhanden sein, wenn mindestens ein Element erforderlich ist. Die Standardwerte sind 0 und unendlich, daher erlaubt "#element" eine beliebige Anzahl, einschließlich null; "1#element" erfordert mindestens eines; "1#2element" erlaubt eines oder zwei.
; comment Ein Semikolon beginnt überall in einer Zeile einen Kommentar, der bis zum Ende dieser Zeile fortgesetzt wird. Dies ist eine einfache Möglichkeit, in Spezifikationen aufzunehmen, ohne formell Teil der erweiterten BNF zu sein.
implied *LWS Sofern nicht anders angegeben, kann lineares Leerzeichen (LWS) in der Grammatik zwischen zwei beliebigen benachbarten Token (Token, Trennzeichen) und zwischen Trennzeichen in einigen Regeln (wie "*", "|" oder "#") eingefügt werden. Diese implizite *LWS-Regel sollte keine zusätzlichen Leerzeichen in HTTP-Konstrukten erzeugen, da viele Implementierungen Leerzeichen als Trennzeichen zwischen Anforderungszeilen und generischen Header-Feldern verwenden, um Nachrichten schnell analysieren zu können.
2.2 Basic Rules (Grundregeln)
Die folgenden Regeln werden in der gesamten Spezifikation verwendet, um grundlegende Analysekonstrukte zu beschreiben. Der US-ASCII-Zeichensatz ist durch ANSI X3.4-1986 [21] definiert.
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 definiert die Oktettsequenz als grundlegende Analyseeinheit von Protokollelementen. Die Syntaxregeln für Protokollparameter werden in Form von ABNF angegeben, wie in Abschnitt 2.1 beschrieben, unter Verwendung der folgenden Kernregeln.
CRLF = CR LF
LWS = [CRLF] 1*( SP | HT )
TEXT = <any OCTET except CTLs,
but including LWS>
Die LWS-Regel definiert lineares Leerzeichen (Linear White Space), das zwischen Feldinhalt und Trennzeichen erscheinen kann; es wird verwendet, um über mehrere Zeilen zu falten, ohne die Feldsemantik zu brechen. Alle HTTP/1.1-Header-Feldwerte können auf mehrere Zeilen gefaltet werden, indem mindestens ein SP oder HT vor einem beliebigen LWS platziert wird.
Viele HTTP/1.1-Header-Feldwerte bestehen aus Wörtern (Tokens), Trennzeichen und Zeichenketten in Anführungszeichen. Diese Elemente werden durch SP- oder HT-Zeichen getrennt.
token = 1*<any CHAR except CTLs or separators>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
Kommentare können in einigen HTTP-Header-Feldern enthalten sein. Der in einem Kommentar zulässige Text wird durch die comment-Regel definiert.
comment = "(" *( ctext | quoted-pair | comment ) ")"
ctext = <any TEXT excluding "(" and ")">
Eine Zeichenkette in Anführungszeichen (quoted-string) wird als einzelnes Wort behandelt. Der in einer Zeichenkette in Anführungszeichen zulässige Text wird durch die qdtext-Regel definiert.
quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
qdtext = <any TEXT except <">>
Der Einzelzeichen-Quotierungsmechanismus ermöglicht das Einschließen eines beliebigen CHAR in Konstrukten mit Zeichenketten in Anführungszeichen und Kommentaren.
quoted-pair = "\" CHAR