今日のお仕事

 今日はProxyサーバを作って遊びました。
 
 まあ、評価のお仕事の関係でどうしてもProxyサーバが必要になったので、Proxyサーバを探していたのですが、自分が求めている機能を満たすProxyサーバが見つからないので、結局自分で作ることにしましたとさ。
 
 ただProxyサーバを作るだけなら、そんなに難しくはないのだけれども、パフォーマンスをそれなりに出そうと思ったら、やはりめんどくさそうなので、ライブラリに頼ろうとしてみたり、アプリケーションサーバを無意味にProxy実装にしてみたりしたのですが、結局どれもイマイチ効果がなく、結局1から自分で作ってます。
 
 まあ、めんどくさそうとか散々ごねていた割には、全機能の3,4割が実装できたので、それなら初めから自分でやれば良かったな、と思います。案ずるより生むが易し。

 そんな過程で試したものを列挙。

  • Ooweb

 組み込みHTTPサーバ。
 非常に仕組みが簡単。触ってて中々面白かったです。
 ただ、Request-URIに対応したアノテーションを書いて、そのクラスに処理を委譲する実装だったので、プロキシサーバ的な実装は作れませんでした。

  • Tomcatのアドレスにリクエストがあったらリダイレクトする方式

 Tomcatのルートパスに対して、Proxy的な実装を施してURLを取ってくるようにしようと考えたのですが、これもRequest-URIとマッチしないとサーブレットが起動できないようで実現できず。

  • SquidTomcatの2段構成によるプロキシ実装

 それならば前述のTomcatのRequest-URIにマッチするようにSquidでURL変換を行って2段プロキシな構成にすることを考えたのですが、Tomcatでアドレスを渡すのをGETメッセージのQueryStringにしていた場合、POSTメッセージで処理したいページのProxyはどうなるのか……という部分で詰まり、これも実現できず。
 

 HTTPのプロトコルの解析&補助クラスぐらいならJakartaにあるかもしれん……と漁っていたらJakarta-Commonsの中にHttpClientというコンポーネントを発見。HTTPリクエストの生成、HTTPレスポンスの解析を簡単に行うことができるのだが、HTTPリクエストの解析&HTTPレスポンスの生成ができないため、これも実現不可。
 ただ、これは便利なので最終的に一部組み込んでます。
 

 ネットで調べていたら、WebLogicにはHttpProxyServletというクラスがあるらしい。
 非常に気になる。評価版はダウンロードしたので、いつか試してみよう。
 
 一応Proxy的動作をしてくれるところまではほぼ完成。後は自分が欲しい機能の追加とできればパフォーマンスの改善を。パフォーマンスの改善に関しては、スレッドプールとかProxy-ConnectionのKeep-Alive対応である程度は向上しそうな感じ。