miau's blog?

fugaproxy

前項 の最後で、

あとはローカルプロキシで
・viaproxy. を除いてホスト名解決
・Referer チェックがあるようなサーバに備えて Host: ヘッダを書き換え
までやっちゃえば、さらにお手軽に使えてよさげ。必要になったら書こうかな。

なんて書いたけど、さっそく使いたい場面があったので WEBrick で作ってみた。アイディアは hogeproxy が元になってるので、名前は fugaproxy にしておいた。




■そもそもローカルプロキシを何に使うの?

「このページをこんな風に変更したいんだけど、変更後のイメージ(画面キャプチャ)が欲しい」なんてことを言われることがたまにあります。こういう場合、サーバ上のファイルをいじるのが一番手っ取り早いんですが、

・本番サーバのファイルをいきなり変更するわけにはいかない
・かといって開発機では別の開発が進んでいてモジュールをいじったりするのも面倒

みたいな感じで、クライアントサイドでいじったほうが早いケースってのがあると思います。

Firefox であれば FireBug でちょこちょこ HTML 編集できたりもするんですが、そんなちまちま変更してられないようなケースだと、ローカルプロキシを使って特定のリクエストをローカルファイルの内容で置き換えるアプローチが有効だったりします。

■今回やりたいこと

ローカルプロキシは便利なんですが、この時面倒なのがプロキシの切替。前項ではこの面倒を解消するためにプロキシ自動構成スクリプトを使う方法を考えてみたわけですが、今回はこの場合に使うローカルプロキシを書いてみました、という話。

■ソース

#!/usr/bin/env ruby
require 'webrick'
require 'webrick/httpproxy'

class MyProxyServer < WEBrick::HTTPProxyServer
def proxy_service(req, res)
# ホスト名の先頭から viaproxy. を除去
if req.host.sub!(/^viaproxy\./, '') then
# Host ヘッダの先頭からも viaproxy. を除去
req.header['host'].each{|value|
value.sub!(/^viaproxy\./, '')
}
# Referer ヘッダの先頭からも viaproxy. を除去(ちょっといいかげん)
req.header['referer'].each{|value|
value.sub!(/viaproxy\./, '')
}
end

# プロキシのメイン処理
super

# host/path_info というファイルがあれば、その内容をレスポンスとして返す
path = req.host + '/' + req.path_info
begin
if FileTest.file?(path)
res.header.delete('content-encoding')
res.header.delete('content-length')
res.body = File.read(path);
print "\n\nREAD => " + path + "\n\n"
end
rescue
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

■参考 URL

WEBrickでプロキシを作る - えとブログ(2006-02-10)

WEBrick のカスタマイズについて、handler を指定するよりも WEBrick::HTTPProxyServer を継承したほうがいい、とのことで。確かにこのほうが小回りが効いていい気がする。

■使用感その他

URL を変えるだけでプロキシの有無を切り替えられるから、やっぱり楽で良いです。

あとやりたいこととしては、

・プロキシ経由の接続時に、コンテンツをローカルにキャッシュする
(別の方法でもいいけど、もっとシームレスに使えるようにする)
・URL→ローカルファイル名の置換時に wget っぽい変換かける
・今回はサーバ上のコンテンツをローカルファイルで置き換えるのが目的だったけど、ついでにコンテンツ変換もできるようにする?

あたり?ま、この辺りも必要になったら対応する感じで。

■問題点?

Fiddler と IE を同時に使っていたときに見られた現象だけど、PAC ファイルの内容を無視してリクエストが送られたりしてた気がする。どうも Fiddler は PAC ファイルとの併用はうまくないらしい。(入れてるバージョンが古いので、最新版だと改善されてるかもしれませんが。)

あと、Sleipnir を使っている場合 IE オプションで PAC ファイルを変更しなおしても、プロキシ設定が即時反映されなかった。

Internet Explorer の自動プロキシ キャッシュを無効にする方法

これを試せばうまくいくかもしれないけど、以前この方法でうまくいかないケースとかあったからあまり信用してなかったり。
posted at 13:23:17 on 2007-12-04 by miau - Category: Ruby No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。