2008/12/20

WEBrickで遊ぶ

今日は会社の忘年会兼コーディングパーティです。何をするかというと、日中は社員みんなで集まって各自コーディングして成果発表、そのまま夜は酒を呑む、という感じ。僕の会社は皆社外に出ていて集まることがほとんど無いので、たまにこういうことやると楽しいです。
僕も久しぶりにコーディング。WEBrickで遊んでみます。

まずはWebServerとして使ってみる。

#!/usr/bin/ruby -Ku

require 'webrick'
#includeしてしまえばWEBrick::は省略可能
#include WEBrick

# HTTP Serverオブジェクトを生成
s = WEBrick::HTTPServer.new(
# DocumentRootをカレントに
:DocumentRoot => Dir::pwd,
# defaultはstderr,stdoutにCombined形式で出力
:AccessLog => [[ $stdout, WEBrick::AccessLog::COMBINED_LOG_FORMAT ],],
# WEBrick自体のログを取得。
:Logger => WEBrick::Log::new("log.txt",WEBrick::Log::DEBUG),
# Portを指定
:Port => 10080
)

# FileHandlerでファイルをマウントする
s.mount("/test", WEBrick::HTTPServlet::FileHandler, "./test/test.html")

# CGIHandlerでCGIをマウント、実行させる
s.mount("/hoge.pl", WEBrick::HTTPServlet::CGIHandler, "./hoge.rb")

# Servletでコンテンツを返す。かつBasic認証させる。
class Hello < WEBrick::HTTPServlet::AbstractServlet
def do_GET(req,res)
WEBrick::HTTPAuth.basic_auth(req,res, "Realm") {|user,pass|
user == 'webrick' && pass == 'webrick'
}
res.body = "authenticate"
end
end

s.mount("/hello",Hello)

# Ctrl+Cでシャットダウンさせる
trap("INT") { s.shutdown }

# HTTP Server 起動
s.start

おーすごいすごい。

じゃあ次はProxyにしてみる。

#!/usr/bin/ruby -Ku

require 'webrick/httpproxy'

s = WEBrick::HTTPProxyServer.new(
:Port => 10088
)

trap("INT") { s.shutdown }
s.start

すげぇ、7行でProxyサーバが出来た。
Rubyist Magazine - WEBrickでプロキシサーバを作って遊ぶを参考にフィルタ作る。

#!/usr/bin/ruby -Ku

require 'webrick/httpproxy'

handler = Proc.new() {|req,res|
if res['content-type']=~/text\/html/
res.body.gsub!(/Perl/m,'Ruby')
end
}

s = WEBrick::HTTPProxyServer.new(
:Logger => WEBrick::Log::new("proxy.log",WEBrick::Log::DEBUG),
:Port => 10088,
:ProxyContentHandler => handler
)

trap("INT") { s.shutdown }
s.start

PerlがRubyに置き換わりました。おもしろい。