evma_httpserverでworkerにhttpインタフェースも付ける
EventMachineで色々な処理(socketとかシリアルポートとか)をしているworkerに、httpからも一部機能を使えるAPIがほしかったので調べたらevma_httpserverを使うとヨサゲだったので調べた。
gem install eventmachine_httpserver
0.21が入った。windows用には0.20があった。
http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/
と、gem付属のREADMEのsynopsis参考になる。
試しに
em-httpserver-test.rb
#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'rubygems' require 'eventmachine' require 'evma_httpserver' class Handler < EventMachine::Connection include EventMachine::HttpServer def process_http_request res = EventMachine::DelegatedHttpResponse.new(self) puts "request_method : #{@http_request_method}" puts "path_info : #{@http_path_info}" puts "query_str : #{@http_query_string}" puts "post_content : #{@http_post_content}" res.status = 200 res.content = "<h1>こんにちは</h1>おはよーおはよー" res.send_response end end EventMachine::run do # ちょっとした仕事 EventMachine::defer do loop do puts "--"+Time.now.to_s sleep 1 end end EventMachine::start_server("0.0.0.0", 8080, Handler) puts "http server start, port 8080" end
ブラウザで http://localhost:8080 にアクセスしてみたり、curlでリクエストしてみたりした
curl -d 'aa=bb&name=shokai' 'http://localhost:8080/a/b/c?iiii=jjjj&kkkk=llll'
結果
http server start, port 8080 --Sat Jan 15 22:02:34 +0900 2011 request_method : POST path_info : /a/b/c query_str : iiii=jjjj&kkkk=llll post_content : aa=bb&name=shokai --Sat Jan 15 22:02:35 +0900 2011 request_method : POST path_info : /a/b/c query_str : iiii=jjjj&kkkk=llll post_content : aa=bb&name=shokai --Sat Jan 15 22:02:36 +0900 2011 --Sat Jan 15 22:02:37 +0900 2011
ちゃんと並列に動いてた。EventMachine::HttpServerをincludeしたクラス内で@http_path_infoとか@http_query_stringとかでリクエスト内容を取得できる。
readme見ると取れるのはこれらしい
@http_protocol @http_request_method @http_cookie @http_if_none_match @http_content_type @http_path_info @http_request_uri @http_query_string @http_post_content @http_headers