Google App Engine で Apache HttpClinet を使う方法

あれだけ苦しんだので、何処にもログが残らないのは寂しいのでここに記述。

Google App Engine で Apache HttpClient 4 を使うためには、まず、Socketを使わないClientConnectionのラッパが必要です。

ソースなどはこちら
http://esxx.blogspot.com/2009/06/using-apaches-httpclient-on-google-app.html

コンパイルと使い方についてはこちら
http://peterkenji.blogspot.com/2009/08/using-apache-httpclient-4-with-google.html

さて、ここまでは簡単にわかったのですが、その後、なぜかクッキーが使えない現象が発生しました。結論から言うと、HttpClient の クッキー を RFC 2965 形式であつかうようにすればOKでした。

BasicHttpParams params = new BasicHttpParams();
GAEConnectionManager manager = new GAEConnectionManager();
HttpClient client = new DefaultHttpClient(manager, params);
client.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2965);


原因は、GAEのfetchサービスがRFC_2965でないクッキーを強制的にRFC_2965形式に変換し、しかも、古い記述を残したまま多重化するために、サーバサイドでエラーとなっていたようです。

エラーの時に出しているつもりのヘッダ
Host: xxxx.ne.jp
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.0.1 (java 1.5)
Cookie: hogehoge=xxxxxxx; burabura=yyyyyyyyyyyyy
Cookie2: $Version=1


エラーの時に実際に出ているヘッダ
Host: xxxx.ne.jp
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.0.1 (java 1.5)
Cookie: hogehoge=xxxxxxx; burabura=yyyyyyyyyyyyy
Cookie2: $Version=1
Cookie: $Version=0; hogehoge=xxxxxxx; $Path=/
Cookie: $Version=0; burabura=yyyyyyyyyyyyy; $Path=/

0 コメント: