HttpURLConnection.getResponseCode () retorna -1 na segunda chamada
Eu pareço estar correndo em um problema peculiar no Android 1.5 quando uma biblioteca que estou usando (sinalização 1.1-SNAPSHOT), faz duas conexões consecutivas para um servidor remoto. A segunda conexão sempre falha com umHttpURLConnection.getResponseCode()
do-1
Aqui está um testcase que expõe o problema:
// 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);
}
}
Basicamente, se eu assinar a solicitação e, em seguida, consumir todo o fluxo de entrada, a próxima solicitação falhará com um resultado de -1. A falha não parece acontecer se eu acabei de ler um caractere do fluxo de entrada.
Observe que isso não acontece em nenhuma URL - apenas URLs específicos, como a acima.
Além disso, se eu alternar para usar o HttpClient em vez de HttpURLConnection, tudo funcionará bem:
// 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);
}
}
encontreireferências para o que parece ser um problema semelhante em outros lugares, mas até agora não há soluções. Se eles são realmente o mesmo problema, então o problema provavelmente não está com a indicação, já que as outras referências não fazem nenhuma referência a ele.
Alguma ideia?