Archive for 2月 17th, 2009

Restlet1.1.2でProxyを経由するのがめんどい

Restletをクライアントとして使う場合、Commons-HttpClientと組み合わせて使うんだけど、そんときにProxy通さなきゃいけない場合にめんどかったのでメモ。

まず、普通にhttp.proxyHostとhttp.proxyPortにProxyのホスト名とポート番号設定するだけじゃ動きません。
それってCommons-HttpClient使うときも同じで、HostConfigurationのsetProxyメソッドで設定してやる必要がある。
だけど、RestletをCommons-HttpClientと組み合わせる場合、Commons-HttpClientは完全に隠蔽されていて直接Commons-HttpClientのクラスにアクセスすることができません。

ってなわけで、なんかやり方ないかと思いググってみた。そしたら

Webサービス プログラミング総合スレッド

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で次バージョンではなくなるよ!って書いてあるんだけど、次バージョンではこんな改造いらなくなるはずだからまあいいでしょう。

次のページ »