Ruby 在Eventmachine中响应HTTP请求
我有一个用于集成测试的非常简单的服务器,使用eventmachine构建:Ruby 在Eventmachine中响应HTTP请求,ruby,http,eventmachine,Ruby,Http,Eventmachine,我有一个用于集成测试的非常简单的服务器,使用eventmachine构建: EM.run do EM::start_server(server, port, HttpRecipient) end 我可以接收HTTP请求并像这样解析它们: class HttpRecipient < EM::Connection def initialize @@stored = '' end # Data is received in chunks, so here
EM.run do
EM::start_server(server, port, HttpRecipient)
end
我可以接收HTTP请求并像这样解析它们:
class HttpRecipient < EM::Connection
def initialize
@@stored = ''
end
# Data is received in chunks, so here we wait until we've got a full web request before
# calling spool.
def receive_data(data)
@@stored << data
begin
spool(@@stored)
EM.stop
rescue WEBrick::HTTPStatus::BadRequest
#Not received a complete request yet
end
end
def spool(data)
#Parse the request
req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)
req.parse(StringIO.new(@@stored))
#Send a response, e.g. HTTP OK
end
end
class-HttpRecipient @@储存如果你想要简单的东西,就用薄的或彩虹的。它在内部使用Eventmachine并提供机架接口支持
# config.ru
http_server = proc do |env|
response = "Hello World!"
[200, {"Connection" => "close", "Content-Length" => response.bytesize.to_s}, [response]]
end
run http_server
然后
>> thin start -R config.ru
UPD
若您需要服务器并行运行,可以在线程中运行它
require 'thin'
class ThreadedServer
def initialize(*args)
@server = Thin::Server.new(*args)
end
def start
@thread = Thread.start do
@server.start
end
end
def stop
@server.stop
if @thread
@thread.join
@thread = nil
end
end
end
http_server = proc do |env|
response = "Hello World!"
[200, {"Connection" => "close", "Content-Length" => response.bytesize.to_s}, [response]]
end
server = ThreadedServer.new http_server
server.start
# Some job with server
server.stop
# Server is down
为什么不想在所有HTTP工作中使用Rainbows或Thin?这看起来是一种可能性。我需要能够在ruby脚本中启动和停止服务器(rspec测试)。如果我能做到的话,这是个不错的选择。这看起来正是我想要的。我今天没有时间去尝试,但我明天会去尝试并向你汇报。