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もやれってことなんだろうか。