Jettyでプロキシサーバ作る

スポンサーリンク

Jettyのorg.mortbay.servlet.ProxyServletを使うと、リクエスト/レスポンスをそのまま中継するだけのプロキシサーバが簡単に動かせます。(Jetty 6.1.5で確認)
適当なWEBアプリケーションとして、 ProxyServletで全てのリクエストを受けるようにしておけばOKです。
ProxyServletでは、接続先に対してURLConnectionを使って接続し、リクエストの内容をコピー、そして受け取ったレスポンスをコピーして返却するような処理をしています。
ソースのコメントみると、「EXPERIMENTAL Proxy servlet.」となっているので、どこまでちゃんとプロキシとしての処理が実装されているのか不明ですが、私が使ってみた限りでは、特にエラーとなるようなことはありませんでした。

単に中継するだけのプロキシサーバでは使い道があまりなさそうですが、このサーブレットを拡張したり、サーブレット自体には手をいれなくても、サーブレットフィルタをかぶせる事によって、リクエスト、レスポンスに対してフィルタをかけるようなプロキシサーバが簡単に実装できるのではと思います。(テスト用のローカルプロキシとして使うには十分使えそう)
ちなみに、Selenium RC(該当クラスはorg.openqa.selenium.server.ProxyHandler)は、このサーブレットのソースを流用しているように見えました。


んで、試しに特定のリクエストをローカルファイルから読み出すようなプロキシ作ってみました。(PerlRubyだと既出ですが、、)

実行にはJREが必要です。1.4.2で確認しましたが、5.0でも動くと思います。
解凍したディレクトリにて下記を実行するとプロキシサーバが起動されます。(start.batにも同内容が書いてあるので、そっちを実行してもOKです)

java -jar proxy-server.jar

Windows上ならばproxy-server.jarをそのままダブルクリックしても起動できますが、そうすると停止がタスクマネージャからしか出来なくなるので、ご注意ください。

サーバの設定は、config.txtを編集して行います。

[Server]
listenPort=8888
#proxyHost=localhost
#proxyPort=8889

[Mapping]
www.enjoyxstudy.com
/base.css -> c:/test/css/base.css
/temp/ -> c:/test/temp/

d.hatena.ne.jp
/onozaty/ -> c:/onozaty/

listenPortにはプロキシとして使用するポート番号を指定します。
proxyHost、proxyPortは、本プロキシサーバから接続するプロキシがある場合にはコメントアウトを外して設定してください。
[Mapping]以降には、リクエストとローカルファイルのマッピングを下記のような形式で記載します。

<ホスト名>
<URI> -> <ローカルファイルパス>
<URI> -> <ローカルファイルパス>

サンプルだと、
http://www.enjoyxstudy.com/base.css に対するリクエストを、c:/test/css/base.css から読み出し、
http://www.enjoyxstudy.com/temp/hoge.html に対するリクエストは、c:/test/temp/hoge.html から読み出されることになります。


参考になるかわかりませんが、ソースも同梱しておきます。
ProxyServletはそのままに、サーブレットフィルタでローカルファイルから読み出す処理を追加しているだけです。思った以上に簡単、時間もかからず出来ました。