我有一个非常简单的服务器,用于集成测试,使用事件机器构建:
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问题是,我该如何回应呢?Eventmachine为发送响应提供了一个send_data,但这并不能理解http。类似地,也有用于发送请求的em-http-request模块,但这是否能够生成响应并不明显。
我可以手动生成HTTP消息,然后使用send_data发送消息,但是我想知道是否有一种干净的方法来使用现有的http库,还是内置到事件机器中的功能?
发布于 2013-08-14 15:33:42
如果你想要简单的东西,那就用薄的或彩虹。它在内部使用Eventmachine,并提供Rack接口支持。
# 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.ruUPD。
如果您需要服务器并行运行,您可以在线程中运行它
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 downhttps://stackoverflow.com/questions/18233388
复制相似问题