Je semble être confronté à un problème particulier sur Android 1.5 lorsqu'une bibliothèque que j'utilise (panneau 1.1-SNAPSHOT), effectue deux connexions consécutives à un serveur distant. La deuxième connexion échoue toujours avec un HttpURLConnection.getResponseCode()
de -1
HttpURLConnection.getResponseCode() renvoie -1 à la deuxième invocation
Voici un testcase qui expose le problème:
// 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);
}
}
En gros, si je signe la demande et consume le flux d'entrée entier, la requête suivante échouera avec un code de résultat de -1. L'échec ne semble pas se produire si je viens de lire un caractère du flux d'entrée.
Notez que cela ne se produit pas pour n'importe quelle URL - juste des URL spécifiques telles que celle ci-dessus.
De plus, si je passe à l'aide HttpClient au lieu de HttpURLConnection, tout fonctionne 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);
}
}
J'ai trouvé references à ce qui semble être un problème similaire ailleurs, mais jusqu'à présent aucune solution. S'ils sont vraiment le même problème, alors le problème n'est probablement pas avec signpost puisque les autres références n'y font aucune référence.
Des idées?
Intéressant. L'ajout de 'System.setProperty (" http.keepAlive "," false ")' au début du test permet de résoudre complètement le problème. Des suggestions sur la façon de faire la trace http? Ai-je besoin d'utiliser un proxy de journalisation ou y a-t-il quelque chose que je peux faire directement sur le client? – emmby
Voir ma modification .............. –
Confirmé que c'est un bug android, et nous le suivons ici: http://code.google.com/p/android/issues/ detail? id = 7786 –