Запутанный парсер HTTP?
Я изучаю Go, и я подумал, что было бы неплохо реализовать собственный синтаксический анализатор HTTP 1.1 с использованием Ragel и Go. Я подумал, что было бы неплохо взглянуть на кодовую базу Mongrel2, чтобы увидеть, как это делается.
Код для синтаксического анализатора HTTP Mongrel находится здесь, и мне трудно понять выделенную функцию http11_parser.c, которая, кажется, выполняет фактическую обработку HTTP.
Мои вопросы следующие:
- На простом английском языке, что лежит в основе идеи реализации? Что делает код?
- Предполагая, что существует такая вещь, как идиоматический 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.