使用しているライブラリ(標識1.1-SNAPSHOT)がリモートサーバーに2回連続して接続すると、Android1.5で特有の問題が発生しているようです。HttpURLConnection.getResponseCode()
2番目の接続は常に失敗します-1
問題を明らかにするテストケースは次のとおりです。
// BROKEN
public void testDefaultOAuthConsumerAndroidBug() throws Exception {
for (int i = 0; i < 2; ++i) {
final HttpURLConnection c = (HttpURLConnection) new URL("https://api.tripit.com/oauth/request_token").openConnection();
final DefaultOAuthConsumer consumer = new DefaultOAuthConsumer(api_key, api_secret, SignatureMethod.HMAC_SHA1);
consumer.sign(c); // This line...
final InputStream is = c.getInputStream();
while( is.read() >= 0 ) ; // ... in combination with this line causes responseCode -1 for i==1 when using api.tripit.com but not mail.google.com
assertTrue(c.getResponseCode() > 0);
}
}
基本的に、リクエストに署名してから入力ストリーム全体を消費すると、次のリクエストは結果コード-1で失敗します。入力ストリームから1文字を読み取っただけでは、失敗は発生しないようです。
これはどのURLでも発生しないことに注意してください。上記のような特定のURLだけです。
また、HttpURLConnectionの代わりにHttpClientを使用するように切り替えると、すべてが正常に機能します。
// WORKS
public void testCommonsHttpOAuthConsumerAndroidBug() throws Exception {
for (int i = 0; i < 2; ++i) {
final HttpGet c = new HttpGet("https://api.tripit.com/oauth/request_token");
final CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(api_key, api_secret, SignatureMethod.HMAC_SHA1);
consumer.sign(c);
final HttpResponse response = new DefaultHttpClient().execute(c);
final InputStream is = response.getEntity().getContent();
while( is.read() >= 0 ) ;
assertTrue( response.getStatusLine().getStatusCode() == 200);
}
}
他の場所でも同様の問題と思われるものへの参照を見つけましたが、これまでのところ解決策はありません。それらが本当に同じ問題である場合、他の参照はそれを参照していないため、問題はおそらく道標にあるのではありません。
何か案は?