Mi sembra che si stia verificando un problema particolare su Android 1.5 quando una libreria che sto utilizzando (signpost 1.1-SNAPSHOT), effettua due connessioni consecutive a un server remoto. La seconda connessione non riesce sempre con un HttpURLConnection.getResponseCode()
di -1
HttpURLConnection.getResponseCode() restituisce -1 alla seconda chiamata
Ecco un testcase che espone il 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);
}
}
In sostanza, se firmo la richiesta e quindi consumare l'intero flusso di input, la richiesta successiva non riuscirà con un resultcode di -1. L'errore non sembra accadere se ho appena letto un carattere dal flusso di input.
Nota che questo non accade per nessun URL, solo URL specifici come quello sopra.
Inoltre, se posso passare ad usare HttpClient invece di HttpURLConnection, tutto funziona bene:
// 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);
}
}
ho trovato references a quello che sembra essere un problema simile altrove, ma finora nessuna soluzione. Se sono davvero lo stesso problema, allora il problema probabilmente non è con il cartello, poiché gli altri riferimenti non fanno riferimento ad esso.
Qualche idea?
Interessante. L'aggiunta di 'System.setProperty (" http.keepAlive "," false ")' all'inizio del testcase risolve completamente il problema. Qualche suggerimento su come eseguire la traccia http? Devo utilizzare un proxy di registrazione o c'è qualcosa che posso fare direttamente sul client? – emmby
Vedere la mia modifica .............. –
Confermato che si tratta di un bug di Android e lo stiamo tracciando qui: http://code.google.com/p/android/issues/ detail? id = 7786 –