Ошибка В Протоколе Http

В этой статье я хочу рассказать не столько об ошибке в RFC 2616, сколько о своем подходе к созданию парсера HTTP-сообщений, показывающем его преимущества и недостатки.

Мой подход основан на двух принципах «Лучше потерять час, чем долететь за пять минут» И «дайте компьютеру поработать, а я отдохну» .

И так задача в целом: реализовать HTTP-сервер, и HTTP-парсер в частности.

Версия протокола 1.1 описана в RFC 2616. В этой спецификации можно выделить две сущности: описательную часть и правила BNF, определяющие синтаксис сообщений.

Правила BNF — вещь хорошо формализованная, для чего есть даже RFC 5234, где грамматика BNF описывается с использованием опять же правил BNF. Правда, RFC 5234 был выпущен позже, чем RFC 2616 (HTTP), и имеет несколько незначительных отличий.



БНФ, короткая экскурсия
Грамматика БНФ достаточно проста, поэтому приведу пример с пояснениями, думаю этого будет достаточно, чтобы получить представление (для тех, кто не знаком).

  
  
  
  
   

start-line = Request-Line | Status-Line generic-message = start-line *(message-header CRLF) CRLF [ message-body ]

Если перевести на русский, то это будет: 1) стартовая строка — это Request-Line или Status-Line (это тоже правила, которые где-то описаны) 2) общее-сообщение представляет собой последовательность начальной строки, *(CRLF заголовка сообщения), CRLF и, возможно, тела сообщения ([.

] круглые скобки указывают на необязательность).

Где *(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 #Алгоритмы

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.