Соглашения по нотации и общая грамматика. Расширенные BNF
Все механизмы, специфицированные ниже, описаны с использованием обычного текста и расширенных форм БахусаНаура BNF (BackusNaur Form; см. RFC-822). Пользователи должны быть знакомы с этой нотацией для понимания данной спецификации. Расширение BNF включает в себя следующие конструкции.
name = definition
Имя правила не требует помещения в угловые скобки. Некоторые базовые правила записываются прописными буквами, например, SP, LWS, HT, CRLF, DIGIT, ALPHA и пр.
literal
Двойные кавычки используются для выделения символьного текста.
rule1 | rule2
Элементы, разделенные вертикальной чертой, ( | ) являются альтернативными, например, "yes | no" допускает yesили no (да или нет).
(rule1 rule2)
Элементы, помещенные в круглые скобки, рассматриваются как один элемент. Так, "(elem (foo | bar) elem)" допускают последовательности "elem foo elem" и "elem bar elem".
*rule
Символ "*", предшествующий элементу, указывает на повторение. Полная форма "<n>*<m>element" указывает как минимум на <n> и как максимум <m> повторений элемента. Значения по умолчанию равны 0 и бесконечности, так что запись "*(элемент)" допускает любое число повторений, включая ноль; "1*element" требует, по меньшей мере, один; а "1*2element" допускает один или два элемента.
[rule]
В квадратные скобки заключаются опционные элементы; [foo bar] эквивалентно *1(foo bar).
n rule
Специальный повтор: <n>(элемент) эквивалентно <n>*<n>(элемент); то есть, точно <n>(element). Таким образом, 2DIGIT является 2-значным числом, а 3ALPHA представляет собой строку из трех буквенных символов.
#rule
Конструкция "#" определена подобно "*", для описания списка элементов. Полная форма имеет вид "<n>#<m>element", отмечая, по меньшей мере <n> и по большей — <m> элементов, отделенных друг от друга одной или более запятыми (",") и опционно строчным пробелом (LWS — Linear White Space). Это делает обычную форму списков очень простой. Запись (*LWS элемент (*LWS элемент *(*LWS "," *LWS элемент)) может быть представлена, как 1#element.
Всюду, где используется эта конструкция, допускаются нулевые элементы, но они не учитываются при подсчете элементов. То есть, допускается запись "(элемент), (элемент)", но число элементов при этом считается равным двум. Следовательно, там, где необходим хотя бы один элемент, должен присутствовать, по крайней мере, один ненулевой элемент. Значениями по умолчанию являются 0 и бесконечность, таким образом "#элемент" допускает любое число, включая нуль; "1#элемент"требует, по меньшей мере один, а "1#2элемент" допускает один или два.
; комментарий
Точка с запятой, смещенная вправо от линейки текста, открывает комментарий, который продолжается до конца строки. Это простой способ включения замечаний в тексты спецификаций.
implied *LWS
Грамматика, описанная в данной спецификации, ориентирована на слова. Если не оговорено обратного, строчный пробел (LWS) может быть заключен между любыми двумя соседними словами (лексема или заключенная в кавычки строка), и между смежными лексемами ( token ) и разделителями ( TSpecials ) без изменения интерпретации поля. По крайней мере один разграничитель ( TSpecials ) должен присутствовать между любыми двумя лексемами, так как они иначе будут интерпретироваться как одна.
Основные правила
Следующие правила используются практически во всей спецификации для описания основных конструкций разбора (парсинга).
OCTET = <любая 8битовая последовательность данных>
CHAR = <любой символ USASCII (октеты 0 127)>
UPALPHA = <любая прописная буква USASCII "A".."Z">
LOALPHA = < любая строчная буква USASCII "a".."z">
ALPHA = UPALPHA | LOALPHA (строчная или прописная буква)
DIGIT = <любая цифра USASCII "0".."9">
CTL = <любой управляющий символ USASCII (октеты 0 31) и DEL (127)>
CR = <USASCII CR>, возврат каретки (13)
LF = <USASCII LF, перевод строки (10)>
SP = <USASCII SP, пробел (32)>
HT = <USASCII HT, знак горизонтальной табуляции (9)>
<"> = <USASCII двойная кавычка (34)>
HTTP/1.1 определяет последовательность CR LF как маркер конца для всех протокольных элементов, за исключением тела элемента. Маркер конца строки в пределах тела объекта определен соответствующим типом среды.
CRLF = CR LF
HTTP/1.1 заголовки могут занимать несколько строк, если продолжение строки начинается с пробела или символа горизонтальной табуляции. Все строчные пробелы имеют ту же семантику, что и обычный пробел ( SP ).
LWS = [CRLF] 1*( SP | HT )
Правило TEXT используется только для содержимого описательных полей и значений, которые не предполагается передавать интерпретатору сообщений. Слова *TEXT могут содержать символы из символьного набора, не совпадающего с ISO 88591 [7.22], только когда они закодированы согласно правилам RFC-1522 [7.14].
TEXT = <любой OCTET за исключением CTL, но включая LWS>
В некоторых протокольных элементах используются шестнадцатеричные цифровые символы.
HEX = "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT
Многие значения полей заголовков HTTP/1.1 состоят из слов, разделенных LWS или специальными символами. Эти специальные символы должны представлять собой строки, заключенные в кавычки, чтобы использоваться в качестве значения параметра.
Token = 1*<любой CHAR за исключением CTL или tspecials>
Tspecials = "(" | ")" | "<" | ">" | '@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
Комментарии могут быть включены в некоторые поля HTTP заголовков, при этом текст комментария заключается в скобки. Комментарии допустимы только для полей, содержащих comment как часть описания поля. В других полях скобки рассматриваются как элемент содержимого поля.
Комментарий = "(" *( ctext | комментарий) ")"
ctext = <любой TEXT, исключая "(" и ")">
Строка текста воспринимается как одно слово, если она помещена в двойные кавычки.
quotedstring = ( <"> *(qdtext) <"> )
qdtext = <любой TEXT, исключая <">>
Символ обратная косая черта ( "\" ) может использоваться вместо кавычки внутри закавыченного текста или в структурах комментариев.
quotedpair = "\" CHAR