HttpURLConnection.getResponseCode () zwraca -1 przy drugim wywołaniu

Wydaje mi się, że wpadam na specyficzny problem na Androidzie 1.5, gdy biblioteka, której używam (drogowskaz 1.1-SNAPSHOT), wykonuje dwa kolejne połączenia ze zdalnym serwerem. Drugie połączenie zawsze kończy się niepowodzeniemHttpURLConnection.getResponseCode() z-1

Oto testcase, który ujawnia problem:

// 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);
    }
}

Zasadniczo, jeśli podpiszę żądanie, a następnie zużyję cały strumień wejściowy, następne żądanie zakończy się niepowodzeniem z kodem wynikowym -1. Niepowodzenie nie wydaje się, gdybym po prostu odczytał jeden znak ze strumienia wejściowego.

Zauważ, że nie dzieje się tak dla żadnego adresu URL - tylko konkretne adresy URL, takie jak ten powyżej.

Ponadto, jeśli przełączę się na używanie HttpClient zamiast HttpURLConnection, wszystko działa dobrze:

// 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);
    }
}

znalazłemodniesienia do tego, co wydaje się być podobnym problemem gdzie indziej, ale jak dotąd żadnych rozwiązań. Jeśli są naprawdę tym samym problemem, problem prawdopodobnie nie jest związany z drogowskazem, ponieważ inne odniesienia nie odnoszą się do niego.

Jakieś pomysły?

questionAnswers(5)

yourAnswerToTheQuestion