コンテンツフィルタ

「今週中に、選択肢機能を実装します」とほかのメンバーに宣言したわりには、全然やる気がでなかった。こういう日は、無理にがんばらず楽なことをやって時間をつぶすに限る。

で、前々から書きたかったフィルタープロキシを書いてみる。

コンセプトは、「特定URLに対してリンクを張ってあるページをブロックするフィルタ」。だいぶ前に思いついて、どんなもんの精度でブロックできるか気になっていたので、検証してみることにする。

時間切れで、高速化とURLリストの生成はできず。また明日やね。

ソースコードが読みたい方は"続きを読む"からどうぞ。ライセンスはNYSLで。

require 'webrick'
require 'webrick/httpproxy'
$KCODE='e'

# URIリストの読み込み
uri_list = []
File.open('uri.txt') {|file|
  file.each{|aLine|
    unless aLine.chomp.empty?
      uri_list.push aLine.chomp
    end
  }
}

# フィルターを生成する
filter = lambda{|request,result|
  count = 0
  if result['content-type'] =~ %r!text/html!
    uri_list.each{|uri|
      if result.body.include?(uri)
        puts "include #uri:"
        count += 1
      end
      if count >= 1
        result.body = '<html><body><h1>Blocked by ruby-proxy</h1></body></html>'
        break
      end
    }
  end
}

# プロキシサーバオブジェクトを作る
s = WEBrick::HTTPProxyServer.new({
  :BindAddress => '127.0.0.1',
  :Port => 8080,
  :Logger => WEBrick::Log::new("log.txt", WEBrick::Log::DEBUG),
  :ProxyVia => false,
  :ProxyContentHandler => filter
})

# SIGINT を捕捉する。
Signal.trap('INT') do
  # 捕捉した場合、シャットダウンする。
  s.shutdown
end
 
# サーバを起動する。
s.start