mod_proxy & mod_filter & mod_python

Firefox を便利にーっていうのは色々考えたものの、どうもなんか Firefox は手に馴染みきらないということで、結局 w3m を使ってるわけですが、 w3m の不満点が見えてきたのは良いことだったと思いました(現代の若者はなんでも正当化)。で、欲しいのは Greasemonkey というか要するにフィルタなわけでして、フィルタプロキシが欲しいと。これは えらい前から これは思ってて、 attohttpD は Lua サポートして書き換えを Lua でー、とか考えてたんですが、どうもいろいろ面倒になったり。ところで lighttpd というのが Lua でほげれるように、とかを jmukさんのところ で知りまして、うん、あー。本題に戻る。

で、最近 Google の検索結果が恐ろしく w3m で見にくくなってまして、いやこれは言いすぎて、 1 2 3 4 5 6 7 8 9 10 次へ とか書いてある部分が見にくくなってたので、これはフィルタプロキシでなんとかせねばなるまい、と。あと w3m で見ると あろはさんとこ の左っかわに見えてるであろーものが上の方にずらずら並んで実はすんごくつらいということと。いやだから本題に。

http://shinh.skr.jp/koneta/filter.py

↑本題。

要するに Apache に mod_proxy と mod_filter(Apache 2.2 以降) と mod_pythonスクリプト言語で気軽に人様のサイトを自分の見やすいようにいじれてはっぴーというのが結論なのですが。まず mod_ruby ですが、フィルタ機能は なんかパッチはある けど入ってないっぽいので却下とあいなりました。

あー突然 Apache の設定置いておきます。

PythonPath "sys.path+['/home/i/wrk/mod_python']"

ProxyRequests On
<Proxy *>
  # ここに mod_estraier の設定

  PythonOutputFilter filter

  FilterProvider estraier estraier resp=Content-Type /^text/
  FilterDeclare inflate CONTENT_SET
  FilterProvider inflate inflate resp=Content-Type /^text/
  FilterDeclare filter CONTENT_SET
  FilterProvider filter filter resp=Content-Type $text/html
  FilterChain estraier filter
</Proxy>

mod_filter は文例が少なくて設定が難しかったです。mod_estraier も同時に使いたいのでこんな感じになってます。なんがよくわからんのは、 PythonOutputFilter filter(1) 、 FilterDeclare filter(2) CONTENT_SET 、 FilterProvider filter(3) filter(4) 、 FilterChain estraier filter(5) 、と filter は 5 つ出てきていて、 1=4, 2=3=5 である必要だけがあるような気がするのですが、なんか全部一緒にしないとうまく動かなくて、ソース見てもあーそんな感じかなぁとか思いました。あと mod_deflate の inflate フィルタも同時に使いたい (w3m はたぶん gunzip 呼んでるだけなので proxy 側で展開しちゃった方が速度の観点からも良いし、どうせフィルタするなら展開必須) のでなんか宣言だけしてありますが、 なんかバグがあって うまくいかんかったです。 snapshot バージョンだと問題ないので将来的には FilterChain inflate estraier filter とかになると思いますが、なんか snapshot は別の問題があったのでとりあえずやめときました。

というわけで gzipPython 側でデコードすることにしたのですが、そんなこんなで世界中で 100 種類くらいの方法で実現されてそうな ime.nu リンクの解除はこんな感じとかで。

        elif r.hostname.find('2ch.net') != -1:
            def imenu_filter(c):
                return c.replace('href="http://ime.nu', 'href="http:/')
            filter_gzip(filter, imenu_filter)

あまりにひどい。

のでブログのマネをしてまとめを書きます。

  • スクリプト言語でプロキシ時に適用される html フィルタを書きたいです。
  • mod_proxy & mod_filter & mod_python で実現できます。
  • Apache モジュールを組み合わせると色々楽しい気分です。
  • mod_filter を使うとフィルタを多段でかけたり条件をつけたりできます。
  • ここでは mod_python でフィルタを作りました。
  • ちなみに Apache の filter ってのは文字列が一気にくるんじゃなくて、バラバラに少しずつ来ます。
  • 上記のスクリプトは、そのバラバラに来てたものをわざわざ一つの文字列にしてから処理してるので効率悪いです。
  • でも別に気になりません。
  • あとグローバル変数でほげってるので同時アクセスが来るとたぶんマズいです。

まとめに始めて出てくるような事項がある始末。これがいわゆる、 日本語の良い文章 です。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h