Мне кажется, что в Android 1.5 возникает специфическая проблема, когда используемая библиотека (signpost 1.1-SNAPSHOT) устанавливает два последовательных соединения с удаленным сервером. Второе соединение всегда прерывается с HttpURLConnection.getResponseCode()
из -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. Похоже, что сбой не произойдет, если я просто прочитаю один символ из входного потока.
Обратите внимание, что это не происходит для любого URL - только конкретные URL, такие как приведенный выше.
Кроме того, если я переключаюсь на использование HttpClient вместо HttpURLConnection, все работает нормально:
// 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);
}
}
Я обнаружил ссылки на то, что кажется аналогичной проблемой в других местах, но пока нет решений. Если это действительно одна и та же проблема, то, вероятно, проблема не в указателе, так как другие ссылки на него не ссылаются.
Есть идеи?