Ich stoße auf ein seltsames Problem auf Android 1.5, wenn eine Bibliothek, die ich verwende (Wegweiser 1.1-SNAPSHOT), zwei aufeinanderfolgende Verbindungen zu einem Remote-Server. Die zweite Verbindung nicht immer mit einem HttpURLConnection.getResponseCode()
von -1
HttpURLConnection.getResponseCode() gibt -1 beim zweiten Aufruf zurück
Hier ist ein Testfall, der das Problem aussetzt:
// 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);
}
}
Grundsätzlich, wenn ich den Antrag unterschreiben und verbrauchen dann den gesamten Eingangsstrom, wird die nächste Anforderung fehlschlagen mit ein Ergebniscode von -1. Der Fehler scheint nicht zu passieren, wenn ich gerade ein Zeichen aus dem Eingabestrom lese.
Beachten Sie, dass dies für keine URL - nur spezifische URLs wie die oben genannten geschieht.
Auch, wenn ich zur Verwendung von Httpclient statt HttpURLConnection wechseln, funktioniert alles einwandfrei:
// 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);
}
}
ich gefunden habe references zu dem, was scheint an anderer Stelle ein ähnliches Problem zu sein, aber bisher keine Lösungen. Wenn es sich wirklich um das gleiche Problem handelt, liegt das Problem wahrscheinlich nicht beim Wegweiser, da die anderen Referenzen keinen Bezug darauf haben.
Irgendwelche Ideen?
Interessant. Das Hinzufügen von 'System.setProperty (" http.keepAlive "," false ")' am Anfang des Testfalls löst das Problem vollständig. Irgendwelche Vorschläge, wie man den HTTP-Trace macht? Muss ich einen Logging-Proxy verwenden, oder kann ich etwas direkt auf dem Client tun? – emmby
Siehe meine Eingabe .............. –
Bestätigt, dass es sich um einen Android-Fehler handelt, und wir finden ihn hier: http://code.google.com/p/android/issues/ Detail? id = 7786 –