Я учусь, и я подумал, что было бы хорошим упражнением для реализации моего собственного парсера HTTP 1.1 с использованием Ragel и Go. Я подумал, что было бы неплохо взглянуть на базу кода Mongrel2, чтобы посмотреть, как это делается.Обфусканный HTTP-парсер?
Код для парсера для сайта Mongrel - here, и я с трудом понимаю выделенную функцию http11_parser.c, которая, похоже, выполняет фактическую обработку HTTP.
Мои вопросы заключаются в следующем:
- На простом английском языке, что основная идея реализации? Что делает код?
- Предполагая, что существует такая вещь, как идиоматический C, является ли этот код хорошим примером? Если нет, есть ли причина для всех этих gotos, вложенных if и переключателей?
PS. Что касается Q2, единственным объяснением, которое я смог найти для использования goto, является here. Обратите внимание, что мой опыт работы с C составляет 0,5 (по шкале от 1 до 10), что объясняет, почему мне сложно понять этот код!
Честно говоря, этот код выглядит так, как будто он был сгенерирован какой-то программой (что-то похожее на 'lex', может быть?). Определенно не стиль кодирования, я бы попытался подражать. – jxh
@jxh Вы правы! Это парсер, основанный на Ragel. http11_parser.c создается из [http11_parser.rl] (https://github.com/zedshaw/mongrel2/blob/master/src/http11/http11_parser.rl), используя формат goto. Что объясняет его! –
Красиво сделано. Я набрал быстрый ответ, когда вы разместили это. – jxh