0

我正在尝试将 HTTP 服务器添加到现有的 Ruby 应用程序。该应用程序基于一个select循环,我也想在那里处理传入的 HTTP 请求(在同一个线程中处理请求很重要,否则我必须跳过箍来编组它们)。

Ruby 为独立的 HTTP 服务器提供了很多解决方案,但我似乎找不到在现有套接字上实现 HTTP 服务器的库。我不想让 HTTP 库打开一个端口并等待,我想给它提供套接字。

我正在寻找的基本逻辑是这样的:

handler = SomeHTTPParsingLibrary.new
# set up handler callbacks, etc on handler...

while socket = get_incoming_connection()
    handler.handle_request(socket)
end

是否有任何现有的 Ruby 库可以像这样工作?HTTP 是一个足够简单的协议,但其中涉及到很多令人讨厌的细节(我需要 cookie、基本身份验证等),我不想自己动手。

4

2 回答 2

0

您可能需要卷起袖子来弄清楚要调用哪些方法,但我建议您HTTPParsermongrel中尝试该类。

于 2013-02-04T18:26:28.277 回答
0

快速浏览httprequest.rb(webrick - 来自 ruby​​ stdlib)中的代码似乎可能适合您的目的。

一个WEBrick::HTTPRequest对象能够接受一个套接字作为其parse()方法的参数。然后它将阻塞,并在请求对象已完全填充传入的 HTTP 请求时返回。

例如:

    res = HTTPResponse.new(@config)
    req = HTTPRequest.new(@config)

    # some code to "select" a socket goes here

    # sock is active, hand it over to the req object for reading.
    req.parse(sock)
    res.request_method = req.request_method

当然,这假设这个线程将阻塞当前请求处理完成。

OTOH,类似的东西tmm1/http_parser.rb也可能满足您的需求,但为了速度而牺牲了其他东西(如处理 cookie)。

于 2013-07-20T01:49:23.243 回答