WEBrickでl33t変換プロキシを作ってみた
いいプログラマはコードをよく読むという。で、Rubyで何を読んだらいいかと聞けば、WEBrickと答える人が多いようだ。構成も美しいし、HTTPサーバなので、ネットワーク関連の処理もテキスト処理も入ってくるからということらしい。それで、あれこれ眺めたり検索したりしていたら、どうもプロキシサーバが簡単に実現できるらしいことが分かった。
l33t文プロキシを作ってみた。プロキシサーバとして何かの処理をやるには、Proc.newでハンドラを定義して、configに書いておく方法が1つ。もう1つはeto日誌さんのところにあるように、WEBrick::HTTPProxyServerを継承してproxy_serviceメソッドをオーバーライドしてしまう方法があるらしい。
後者の方法でやってみた。
#!/usr/bin/ruby require 'webrick' require 'webrick/httpproxy' class MyProxyServer < WEBrick::HTTPProxyServer def proxy_service(req, res) super if req.host == 'slashdot.org' # and res['content-type'] =~ /text\/html/ res.body.gsub!(/\w/){|chr| if rand > 0.5 chr.upcase else chr.downcase.gsub("e","3") end } end end end config = { :BindAddress => '127.0.0.1', :Port => 8080, :Logger => WEBrick::Log.new($stderr), :ProxyContentHandler => nil, :ProxyVia => false, } s = MyProxyServer.new(config) trap('INT') { s.shutdown } s.start
Firefoxを使ってSlashdot.orgを見てみたら、ちゃんとl33t文に変換されていた。しかし、ヘッダもタグも関係なくすべてl33tにしてしまっていて、「cont3nt="t3Xt/html"; chars3T=IsO-8859-1」とかなって画面自体は乱れてしまった。ちゃんと処理するの面倒くさいから、まあ動いた動いたってことで。
こういうの、ふつうはGreasmokeyとかでやるんだろうけど、やっぱりRubyじゃなくてJavaScriptもやれってことなんだろうか。