Запутанный парсер HTTP?

Я изучаю Go, и я подумал, что было бы неплохо реализовать собственный синтаксический анализатор HTTP 1.1 с использованием Ragel и Go. Я подумал, что было бы неплохо взглянуть на кодовую базу Mongrel2, чтобы увидеть, как это делается.

Код для синтаксического анализатора HTTP Mongrel находится здесь, и мне трудно понять выделенную функцию http11_parser.c, которая, кажется, выполняет фактическую обработку HTTP.

Мои вопросы следующие:

  1. На простом английском языке, что лежит в основе идеи реализации? Что делает код?
  2. Предполагая, что существует такая вещь, как идиоматический C, является ли этот код хорошим примером этого? Если нет, есть ли причина для всех этих goto, вложенных если и переключается?

PS. Что касается Q2, единственное объяснение, которое я мог найти для использования goto, здесь. Обратите внимание, что мой опыт работы с C составляет 0,5 (по шкале от 1 до 10), что объясняет, почему мне трудно понять этот код!

1 ответ

Решение

Выделенная функция была сгенерирована программой. Обратите внимание на комментарий в верхней части файла:

/** Machine **/


#line 254 "src/http11/http11_parser.rl"

Итак, вы должны посмотреть на http11_parser.rl файл, чтобы увидеть ввод, который сгенерировал этот код. Это лексер для запроса HTTP/1.1.

Идея функции заключается в том, чтобы проанализировать строку запроса HTTP/1.1 и последующие заголовки. Не пытайтесь внимательно следовать этому, сосредоточьтесь на правилах сопоставления с образцом r1 файл, и сравните его со спецификацией в HTTP/1.1 RFC.

Другие вопросы по тегам