Parece que me estoy encontrando con un problema peculiar en Android 1.5 cuando una biblioteca que estoy usando (señal 1.1-SNAPSHOT) hace dos conexiones consecutivas a un servidor remoto. La segunda conexión falla siempre con un HttpURLConnection.getResponseCode()
de -1
HttpURLConnection.getResponseCode() devuelve -1 en la segunda invocación
Aquí hay un caso de prueba que expone el 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);
}
}
Básicamente, si firmo la solicitud y luego consumir la totalidad del flujo de entrada, la siguiente petición fallará con un código de resultado de -1. La falla no parece ocurrir si solo leo un carácter de la secuencia de entrada.
Tenga en cuenta que esto no ocurre con ninguna URL, solo URL específicas como la anterior.
Además, si me cambio a utilizar en lugar de HttpClient HttpURLConnection, todo funciona bien:
// 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);
}
}
que he encontrado references a lo que parece ser un problema similar en otro lugar, pero hasta ahora no hay soluciones. Si realmente son el mismo problema, entonces el problema probablemente no sea con el poste indicador, ya que las otras referencias no hacen referencia a él.
¿Alguna idea?
interesante. Agregar 'System.setProperty (" http.keepAlive "," false ")' al principio del caso de prueba resuelve completamente el problema. ¿Alguna sugerencia sobre cómo hacer la traza http? ¿Necesito usar un proxy de registro o hay algo que pueda hacer en el cliente directamente? – emmby
Ver mi edición .............. –
Confirmado que es un error de Android, y lo estamos rastreando aquí: http://code.google.com/p/android/issues/ detalle? id = 7786 –