1

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

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

我的问题如下:

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

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

4

1 回答 1

1

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

/** Machine **/


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

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

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

于 2013-06-19T03:18:08.110 回答