Ruby 在Eventmachine中响应HTTP请求

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

我有一个用于集成测试的非常简单的服务器,使用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 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测试)。如果我能做到的话,这是个不错的选择。这看起来正是我想要的。我今天没有时间去尝试,但我明天会去尝试并向你汇报。