Restlet1.1.2でProxyを経由するのがめんどい
Restletをクライアントとして使う場合、Commons-HttpClientと組み合わせて使うんだけど、そんときにProxy通さなきゃいけない場合にめんどかったのでメモ。
まず、普通にhttp.proxyHostとhttp.proxyPortにProxyのホスト名とポート番号設定するだけじゃ動きません。
それってCommons-HttpClient使うときも同じで、HostConfigurationのsetProxyメソッドで設定してやる必要がある。
だけど、RestletをCommons-HttpClientと組み合わせる場合、Commons-HttpClientは完全に隠蔽されていて直接Commons-HttpClientのクラスにアクセスすることができません。
ってなわけで、なんかやり方ないかと思いググってみた。そしたら
794 :デフォルトの名無しさん[]:2008/01/16(水) 21:18:52
restletクライアントのHTTPプロキシ設定でどうやるんですか?
ぐぐってもドキュメントみても何も出てこないです
795 :794[]:2008/01/17(木) 01:04:12
出来たけど難しかった。
うがー、なんか書いといてよー!
気を取り直して他の情報見ると、どうやらバグ報告があり、1.2で直る予定っぽい。
しょうがないので自分で改造するかってことで、RestletのClientクラスの代わりにMyClientクラスを作成することに。
ホントは、Clientクラスの中身コピってMyClientにしようと思ったんだけど、Clientクラス内で呼び出しているEngine#createHelperがどうしても引数にClientクラスのインスタンスを必要とするので、Clientクラスを継承してMyClientクラスを作ります。Engineクラスまで書き換えるのめんどいし。
Clientクラスのhandleメソッドは以下のようになっています。
@Override
public void handle(Request request, Response response) {
super.handle(request, response);
if (getHelper() != null) {
getHelper().handle(request, response);
}
}
ここで、if文の中のgetHelper().handle(request, response)を実行すると、Proxyが超えられなくてエラーになります。
でも、super.handle(request, response)の呼び出しはやっとかないといけません。
そこで、handleメソッドを次のようにオーバーライドしました。
@Override
public void handle(Request request, Response response) {
super.init(request, response);
if (getHelper() != null) {
HostConfiguration hostConfig = new HostConfiguration();
hostConfig.setProxy(System.getProperty("http.proxyHost"), Integer
.parseInt(System.getProperty("http.proxyPort")));
((HttpClientHelper) helper).getHttpClient().setHostConfiguration(
hostConfig);
getHelper().handle(request, response);
}
}
1行目がsuper.handle(request, response)じゃなくて、super.init(request, response)なのがミソ。
このinitメソッドはClientの親のConnectorの親のRestletクラスのメソッド。結局、Clientクラスのhandleメソッド内のsuper.handle(request, response)はこのinitメソッドを実行するだけなので、これで大丈夫。
このメソッドは、実はdeprecatedで次バージョンではなくなるよ!って書いてあるんだけど、次バージョンではこんな改造いらなくなるはずだからまあいいでしょう。
Comments(0)