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