HttpURLConnection.getResponseCode () gibt beim zweiten Aufruf -1 zurück

Ich habe anscheinend ein besonderes Problem mit Android 1.5, wenn eine von mir verwendete Bibliothek (Wegweiser 1.1-SNAPSHOT) zwei aufeinanderfolgende Verbindungen zu einem Remote-Server herstellt. Die zweite Verbindung schlägt immer mit einem fehlHttpURLConnection.getResponseCode() von-1

Hier ist ein Testfall, der das Problem aufdeckt:

// 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 schlägt die nächste Anforderung mit einem Ergebniscode von -1 fehl, wenn ich die Anforderung signiere und dann den gesamten Eingabestream verbrauche. Der Fehler scheint nicht zu passieren, wenn ich nur ein Zeichen aus dem Eingabestream lese.

Beachten Sie, dass dies bei keiner URL der Fall ist - nur bei bestimmten URLs wie der oben genannten.

Auch wenn ich zur Verwendung von HttpClient anstelle von HttpURLConnection wechsle, 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 habe gefundenVerweise zu dem, was anderswo ein ähnliches Problem zu sein scheint, aber bisher keine Lösungen. Wenn es sich wirklich um dasselbe Problem handelt, liegt das Problem wahrscheinlich nicht am Wegweiser, da die anderen Verweise nicht darauf verweisen.

Irgendwelche Ideen?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage