【问题标题】:Obfuscated HTTP parser?混淆的 HTTP 解析器?
【发布时间】:2013-06-15 10:47:25
【问题描述】:

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

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

我的问题如下:

  1. 简单来说,实现背后的基本思想是什么?代码有什么作用?
  2. 假设有像惯用 C 这样的东西,这段代码是一个很好的例子吗?如果不是,那么所有这些 goto、嵌套 if 和 switch 是否有原因?

PS。关于 Q2,我能找到的使用 goto 的唯一解释是 here。请注意,我对 C 的体验是 0.5(范围从 1 到 10),这解释了为什么我难以理解这段代码!

【问题讨论】:

  • 老实说,该代码看起来像是由某个程序生成的(可能类似于lex?)。绝对不是我会尝试模仿的编码风格。
  • @jxh 你是对的!这是一个基于 Ragel 的解析器。 http11_parser.c 使用 goto 驱动格式从 http11_parser.rl 生成。这就解释了!
  • 做得很好。当您发布此内容时,我正在快速输入答案。

标签: c http mongrel2


【解决方案1】:

突出显示的函数是由程序生成的。注意文件顶部附近的注释:

/** Machine **/


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

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

该函数背后的想法是解析 HTTP/1.1 请求行和随后的标头。不要试图紧跟它,重点关注r1文件的模式匹配规则,并将其与HTTP/1.1 RFC中的规范进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2013-06-08
    • 2011-12-13
    相关资源
    最近更新 更多