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);
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
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=/
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=/