CocProxy

http://f.hatena.ne.jp/images/fotolife/c/cho45/20071113/20071113214616.png

めんどくさいことしない置換プロキシー

使い方

  1. http://svn.coderepos.org/share/lang/ruby/cocproxy/proxy.rb をダウンロード
  2. `files' というディレクトリをつくる
  3. 置換したいファイルをてきとうにつっこむ
  4. ruby proxy.rb
  5. ポートとか表示されるのでブラウザの設定を変える

デフォルトだと、

  1. #{File.basename(req.path_info)}",
  2. #{req.host}#{req.path_info}",
  3. #{req.host}/#{File.basename(req.path_info)}",
  4. .#{req.path_info}",

がスキャンされ、ヒットしたら置換されます。

例えば、http://example.com/test/foo/bar.css にアクセスすると

  1. files/bar.css
  2. files/example.com/test/foo/bar.css
  3. files/example.com/bar.css
  4. files/test/foo/bar.css

が順にスキャンされ、最初に発見されたファイルが置換されブラウザに返されます。

この際、サーバ側に実際にファイルがある必要はありません。ブラウザからリクエストが飛んできた時点でルールを走査し、マッチすればリモートサーバにリクエストせずに即座に CocProxy がファイルを返します。

部分置換

正規表現により部分的に置換することもできます。この場合はリモートサーバにリクエストが飛びます。

http://example.com/hoge.html というファイルの style 要素を置換したければ、 ルールにヒットするファイルに

proxy-replace: <style type="text/css">¥s*<!--([^<]+)-->¥s*</style>

などと書き、さらに置換したい内容を書けば、 指定した正規表現のキャプチャのうち、第一番目のキャプチャが該当ファイルの内容で 置換されるようになります。

単純にファイル内容を追記したい場合は

proxy-replace: (\z)

と書けば良いです。(\z は文字列末尾にマッチする)

置換後のファイルでは proxy-replace 以降、行末までは削除されるので、 proxy-replace のあとを HTML エスケープなどする必要はありません。

キャッシュ

開発用のプロキシでリロードをしまくる性質上、 置換対象のファイルでない限り全てのリソースを無条件にキャッシュします。

もしキャッシュをクリアしたければ、?clearcache=1 をつけて、 適当な URL にアクセスすればクリアされます。

さらに

proxy.rb はカレントディレクトリの proxy-config.yaml を設定として読みこむことで、 デフォルトの設定を上書きすることができます。

また、double_screen.rb というファイルがあればロードします。 double_screen.rb は標準出力と標準エラー出力を左右にわけて表示するもので、 使用することで、ちゃんと置換されているかどうかを確認しやすくなります。

Download / Repos.

1ファイル完結版

全部

svn co http://svn.coderepos.org/share/lang/ruby/cocproxy/

Principles

  • 基本的に1つのファイルで完結すること
  • ruby1.9 メイン
  • 標準ライブラリで動くこと

Mongrel Version

WEBrick は、標準ライブラリであり、内部に HTTP Proxy の実装も持っているため手軽なのですが、Pure Ruby なので少々動作が遅いのが欠点です。開発中は頻繁にリロードするという用途上、遅いとストレスがたまるので Mongrel での実装も書きました。

  • ruby1.8 系
  • rubygems/mongrel 依存

で動作確認しています。

Tips

CSS だけを高速にリロードしたい場合、

proxy-replace: (\s*)</head>

<script type="text/javascript">
// <![CDATA[

setInterval(function () {
	var links = document.getElementsByTagName("link");
	for (var i = 0, len = links.length; i < len; i++) if (links[i].rel.match(/stylesheet/)) {
		links[i].href = links[i].href + "?" + (new Date).getTime();
	}
}, 5000);

// ]]>
</script>

という内容のファイルを対象のページにマッチするように配置し (例えばこのページにマッチさせるなら files/CocProxy とか)、CSS を編集すれば、ほうっておいても高速で CSS のみ再適用されるようになります。

Ref.

License

Public Domain