2. Notational Conventions and Generic Grammar (Convenzioni Notazionali e Grammatica Generica)
2.1 Augmented BNF (BNF Aumentato)
Tutti i meccanismi specificati in questo documento sono descritti sia in prosa che in una forma di Backus-Naur aumentata (Augmented Backus-Naur Form, BNF) simile a quella utilizzata in RFC 822 [9]. Gli implementatori dovranno avere familiarità con questa notazione per comprendere questa specifica. Il BNF aumentato include le seguenti costruzioni:
name = definition
Il nome di una regola è semplicemente il nome stesso (senza < e > circostanti), ed è separato dalla sua definizione dal carattere uguale =. Gli spazi sono significativi solo nell'indentazione delle righe di continuazione utilizzate per indicare una definizione di regola che si estende su più righe. Alcune regole di base sono in maiuscolo, come SP, LWS, HT, CRLF, DIGIT, ALPHA, ecc. Le parentesi angolari sono utilizzate nelle definizioni ogni volta che la loro presenza aiuta a distinguere l'uso di un nome di regola.
"literal" Le virgolette racchiudono il testo letterale. A meno che non sia diversamente indicato, il testo non fa distinzione tra maiuscole e minuscole.
rule1 | rule2 Gli elementi separati da una barra verticale ("|") sono alternative, ad esempio, "yes | no" accetterà yes o no.
(rule1 rule2) Gli elementi tra parentesi sono trattati come un singolo elemento. Pertanto, "(elem (foo | bar) elem)" consente le sequenze di token "elem foo elem" e "elem bar elem".
*rule
Il carattere "*" che precede un elemento indica ripetizione. La forma completa è ""<n>*<m>element" che indica almeno <n> e al massimo <m> occorrenze dell'elemento. I valori predefiniti sono 0 e infinito, quindi "*(element)" consente un numero qualsiasi, incluso zero; "1*element" richiede almeno uno; "1*2element" consente uno o due.
[rule] Le parentesi quadre racchiudono elementi opzionali; "[foo bar]" è equivalente a "*1(foo bar)".
N rule
Ripetizione specifica: "<n>(element)" è equivalente a "<n>*<n>(element)"; cioè, esattamente <n> occorrenze di (element). Quindi, 2DIGIT è un numero a 2 cifre e 3ALPHA è una stringa di tre caratteri alfabetici.
#rule
È definito un costrutto "#", simile a "*", per definire elenchi di elementi. La forma completa è "<n>#<m>element" che indica almeno <n> e al massimo <m> elementi, ciascuno separato da una o più virgole (",") e spazio bianco lineare (Linear White Space, LWS) opzionale. Questo rende molto semplice la forma abituale degli elenchi; una regola come:
( *LWS element *( *LWS "," *LWS element ))
può essere visualizzata come:
1#element
Ovunque venga utilizzato questo costrutto, sono consentiti elementi nulli, ma non contano nel numero di elementi presenti. Cioè, "(element), , (element)" è consentito, ma conta solo come due elementi. Pertanto, quando è richiesto almeno un elemento, deve (MUST) essere presente almeno un elemento non nullo. I valori predefiniti sono 0 e infinito, quindi "#element" consente un numero qualsiasi, incluso zero; "1#element" richiede almeno uno; "1#2element" consente uno o due.
; comment Un punto e virgola, ovunque su una riga, inizia un commento che continua fino alla fine di quella riga. Questo è un modo semplice per includere nelle specifiche senza farne formalmente parte del BNF aumentato.
implied *LWS A meno che non sia diversamente indicato, lo spazio bianco lineare (LWS) nella grammatica può essere incluso tra due token (token, separatore) adiacenti qualsiasi, e tra separatori in alcune regole (come "*", "|" o "#"). Questa regola *LWS implicita non dovrebbe produrre spazio bianco aggiuntivo nei costrutti HTTP, poiché molte implementazioni utilizzano lo spazio bianco come separatore tra righe di richiesta e campi di intestazione generici per poter analizzare rapidamente i messaggi.
2.2 Basic Rules (Regole di Base)
Le seguenti regole sono utilizzate in tutta questa specifica per descrivere costrutti di analisi di base. Il set di caratteri US-ASCII è definito da 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 definisce la sequenza di ottetti come l'unità di analisi di base degli elementi di protocollo. Le regole di sintassi per i parametri di protocollo sono fornite in forma di ABNF, come descritto nella sezione 2.1, utilizzando le seguenti regole di base.
CRLF = CR LF
LWS = [CRLF] 1*( SP | HT )
TEXT = <any OCTET except CTLs,
but including LWS>
La regola LWS definisce lo spazio bianco lineare (Linear White Space), che può apparire tra il contenuto del campo e i separatori; è utilizzato per piegare su più righe senza rompere la semantica del campo. Tutti i valori dei campi di intestazione HTTP/1.1 possono essere piegati su più righe posizionando almeno un SP o HT prima di qualsiasi LWS.
Molti valori dei campi di intestazione HTTP/1.1 consistono in parole (token), separatori e stringhe tra virgolette. Questi elementi sono separati da caratteri SP o HT.
token = 1*<any CHAR except CTLs or separators>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
I commenti possono essere inclusi in alcuni campi di intestazione HTTP. Il testo consentito in un commento è definito dalla regola comment.
comment = "(" *( ctext | quoted-pair | comment ) ")"
ctext = <any TEXT excluding "(" and ")">
Una stringa tra virgolette (quoted-string) è trattata come una singola parola. Il testo consentito in una stringa tra virgolette è definito dalla regola qdtext.
quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
qdtext = <any TEXT except <">>
Il meccanismo di quotazione di carattere singolo consente di includere qualsiasi CHAR nei costrutti di stringhe tra virgolette e commenti.
quoted-pair = "\" CHAR