首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >响应事件机中的HTTP请求

响应事件机中的HTTP请求
EN

Stack Overflow用户
提问于 2013-08-14 13:40:39
回答 1查看 568关注 0票数 2

我有一个非常简单的服务器,用于集成测试,使用事件机器构建:

代码语言:javascript
复制
EM.run do
    EM::start_server(server, port, HttpRecipient)    
end

我可以接收HTTP请求并按如下方式解析它们:

代码语言:javascript
复制
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库,还是内置到事件机器中的功能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-14 15:33:42

如果你想要简单的东西,那就用薄的或彩虹。它在内部使用Eventmachine,并提供Rack接口支持。

代码语言:javascript
复制
# config.ru
http_server = proc do |env|
  response = "Hello World!"
  [200, {"Connection" => "close", "Content-Length" => response.bytesize.to_s}, [response]]
end
run http_server

然后

代码语言:javascript
复制
>> thin start -R config.ru

UPD。

如果您需要服务器并行运行,您可以在线程中运行它

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18233388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档