В этой статье я хочу рассказать не столько об ошибке в RFC 2616, сколько о своем подходе к созданию парсера HTTP-сообщений, показывающем его преимущества и недостатки.
Мой подход основан на двух принципах «Лучше потерять час, чем долететь за пять минут» И «дайте компьютеру поработать, а я отдохну» .
И так задача в целом: реализовать HTTP-сервер, и HTTP-парсер в частности.
Версия протокола 1.1 описана в RFC 2616. В этой спецификации можно выделить две сущности: описательную часть и правила BNF, определяющие синтаксис сообщений.
Правила BNF — вещь хорошо формализованная, для чего есть даже RFC 5234, где грамматика BNF описывается с использованием опять же правил BNF. Правда, RFC 5234 был выпущен позже, чем RFC 2616 (HTTP), и имеет несколько незначительных отличий.
БНФ, короткая экскурсия
Грамматика БНФ достаточно проста, поэтому приведу пример с пояснениями, думаю этого будет достаточно, чтобы получить представление (для тех, кто не знаком).
Если перевести на русский, то это будет: 1) стартовая строка — это Request-Line или Status-Line (это тоже правила, которые где-то описаны) 2) общее-сообщение представляет собой последовательность начальной строки, *(CRLF заголовка сообщения), CRLF и, возможно, тела сообщения ([.start-line = Request-Line | Status-Line generic-message = start-line *(message-header CRLF) CRLF [ message-body ]
] круглые скобки указывают на необязательность).
Где *(CRLF заголовка сообщения) допускает 0 или более повторений объединения двух правил заголовка сообщения и CRLF. Чем-то похоже на регулярные выражения, что неудивительно.
Об ошибке
Чтобы отследить ошибку, я привел ниже ряд правил.Бегло взглянув на них, можно увидеть следующее: Запрос состоит из строки запроса и повторения заголовков, разделенных CRLF. Среди групп заголовков есть заголовок объекта, который, в отличие от общего заголовка и заголовка запроса, содержит заголовок расширения.
Правило расширения-заголовка допускает нестандартные заголовки, другими словами, именно это правило позволяет добавлять заголовок к запросу.
My-Header: I am server
запрос останется в силе.
Кроме того, это правило открывает возможность написания расширений протокола.
Поскольку Extension-header допускает любые заголовки, в том числе и стандартные (From, Accept, Host, Referer и т.д.), то возникает следующая ситуация: если сообщение содержит недопустимый стандартный заголовок, оно не будет разрешено описывающим его правилом, но Заголовок расширения -header признает, что это неправильно.
Request = Request-Line ; Section 5.1
*(( general-header ; Section 4.5
| request-header ; Section 5.3
| entity-header ) CRLF) ; Section 7.1
CRLF
[ message-body ] ; Section 4.3
entity-header = Allow ; Section 14.7
| Content-Encoding ; Section 14.11
| Content-Language ; Section 14.12
| Content-Length ; Section 14.13
| Content-Location ; Section 14.14
| Content-MD5 ; Section 14.15
| Content-Range ; Section 14.16
| Content-Type ; Section 14.17
| Expires ; Section 14.21
| Last-Modified ; Section 14.29
| extension-header
extension-header = message-header
message-header = field-name ":" [ field-value ]
field-name = token
field-value = *( field-content | LWS )
field-content = <the OCTETs making up the field-value
and consisting of either *TEXT or combinations
of token, separators, and quoted-string>
К сожалению, в BNF нет способа описать правило типа «что-то, не включая что-то еще».
Спецификация описывает такие правила неформально: ctext = <any TEXT excluding "(" and ")">
qdtext = <any TEXT except <">>
Действующее правило имени поля должно выглядеть примерно так: field-name = <any token excluding "Accept", "Allow", .
all header names from rfc 2616, 2617 .
>
Главное
Я хотел поговорить о коммунальные услуги , которые создают DFA на основе BNF. То есть в идеале парсер генерируется автоматически.Но как-то так получилось, что заголовок слишком долго привлекал внимание, поэтому об инструментах в следующий раз.
УПД : Господа минусовщики, выскажите, пожалуйста, свое мнение.
Если я ошибаюсь, хотелось бы знать, почему.
Теги: #http #BNF #dfa #nfa #dka #nka #программирование #.
NET #Алгоритмы
-
Сегодня 5 Лет Со Дня Запуска Bitcoin
19 Oct, 24 -
Умеете Ли Вы Пользоваться Онлайн-Сервисами?
19 Oct, 24 -
Ищем Мелодию По Фрагменту
19 Oct, 24 -
Моя Безбумажная Технология
19 Oct, 24 -
Microsoft Перевыпускает Ms13-057 И Ms13-061
19 Oct, 24