2013-06-19 2 views
1

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

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

Мои вопросы заключаются в следующем:

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

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

+1

Честно говоря, этот код выглядит так, как будто он был сгенерирован какой-то программой (что-то похожее на 'lex', может быть?). Определенно не стиль кодирования, я бы попытался подражать. – jxh

+0

@jxh Вы правы! Это парсер, основанный на Ragel. http11_parser.c создается из [http11_parser.rl] (https://github.com/zedshaw/mongrel2/blob/master/src/http11/http11_parser.rl), используя формат goto. Что объясняет его! –

+0

Красиво сделано. Я набрал быстрый ответ, когда вы разместили это. – jxh

ответ

1

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

/** Machine **/ 


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

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

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