HTTP-сервер Ruby без сети

Я пытаюсь добавить 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, базовая аутентификация и т. д.), которые я бы предпочел не создавать самостоятельно.


person user2040448    schedule 04.02.2013    source источник


Ответы (2)


Возможно, вам придется немного засучить рукава, чтобы выяснить, какие методы вызывать, но я предлагаю попробовать класс HTTPParser из дворняга.

person robbrit    schedule 04.02.2013
comment
Я выбрал WEBrick, но оказалось, что это легко сделать, просто взглянув на WEBrick::HTTPServer::run. Спасибо. - person user2040448; 05.02.2013

Беглый взгляд на код в httprequest.rb (webrick — из ruby ​​stdlib) кажется, что он может подойти для вашей цели.

Объект WEBrick::HTTPRequest может принимать сокет в качестве аргумента для своего метода parse(). Затем он заблокируется и вернется, когда объект запроса будет полностью заполнен входящим HTTP-запросом.

eg:

    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) в пользу скорости.

person Akshay M    schedule 20.07.2013