混淆的HTTP解析器?

时间:2013-06-19 02:48:20

标签: c http mongrel2

我正在学习Go,我认为使用Ragel和Go实现我自己的HTTP 1.1解析器是一个很好的练习。我认为看看Mongrel2的代码库以了解它是如何完成的,这是一个好主意。

Mongrel的HTTP解析器的代码是here,我很难理解突出显示的函数http11_parser.c,它似乎在进行实际的HTTP处理。

我的问题如下:

  1. 用简单的英语,实施背后的基本理念是什么?代码做了什么?
  2. 假设存在惯用C这样的东西,这个代码是一个很好的例子吗?如果没有,是否存在所有这些getos的原因,嵌套if和switch?
  3. PS。关于Q2,我可以找到使用goto的唯一解释是here。请注意,我对C的经验是0.5(从1到10的比例),这解释了为什么我难以理解这段代码!

1 个答案:

答案 0 :(得分:1)

突出显示的功能由程序生成。请注意文件顶部附近的注释:

/** Machine **/


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

因此,您应该查看http11_parser.rl文件以查看生成此代码的输入。它是HTTP / 1.1请求的词法分析器。

该功能背后的想法是解析HTTP / 1.1请求行和后面的标题。不要试图密切关注它,关注r1文件的模式匹配规则,并将其与HTTP/1.1 RFC中的规范进行比较。