簡體   English   中英

沒有網絡的Ruby HTTP服務器

[英]Ruby HTTP server without networking

我試圖將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,基本身份驗證等),而我不想自己動手。

您可能需要HTTPParser找出要調用的方法,但是我建議從mongrel中嘗試HTTPParser類。

快速瀏覽httprequest.rb的代碼( httprequest.rb來自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類的tmm1/http_parser.rb也可能滿足您的需求,但為了提高速度而犧牲了其他內容(例如處理Cookie)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM