monthly gimite

試験運用中。

[ruby][sinatra] Sinatraのハンドラ内でem-http-requestを使う

Sinatra+Thinで、どこかからHTTPで取得した結果を加工して出力したい、という場合、

require "open-uri"

get("/") do
  open("http://example.com/"){ |f| f.read() }
end

でもいいのですが、これだとexample.comからの返答待ちの間、EventMachineが完全に止まってしまうのがいまいちです。そこでem-http-requestを使おうとしたのですが、それにはハンドラのレスポンスを非同期に返す必要があります。どうするんだろうと思ったのですが、async_sinatraというものがあるようです。

$ sudo gem install async_sinatra em-http-request
require "sinatra/async"
require "em-http"
register(Sinatra::Async)

aget("/") do
  http = EventMachine::HttpRequest.new("http://example.com/").get()
  http.callback() do
    body(http.response)
  end
  http.errback() do
    status(500)
    body("error")
  end
end