Wygląda na to, że mam dziwny problem z Androidem 1.5, gdy biblioteka, z której korzystam (drogowskaz 1.1-SNAPSHOT), wykonuje dwa kolejne połączenia z serwerem zdalnym. Druga gra zawsze kończy się niepowodzeniem z HttpURLConnection.getResponseCode()
z -1
HttpURLConnection.getResponseCode() zwraca -1 przy drugim wywołaniu
Oto testcase że naraża 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 podpisze wniosek i potem konsumować cały strumień wejściowy, następne żądanie nie powiedzie się kod wyniku -1. Awaria nie zdarza się, jeśli po prostu odczytam jeden znak ze strumienia wejściowego.
Pamiętaj, że tak się nie dzieje z żadnym adresem URL - tylko takie adresy URL, jak ten powyżej.
Ponadto, jeśli przełączyć się za pomocą HttpClient zamiast HttpURLConnection, wszystko działa prawidłowo:
// 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łem references do tego, co wydaje się być podobny problem gdzie indziej, ale jak dotąd nie ma rozwiązania. Jeśli to naprawdę ten sam problem, problem prawdopodobnie nie jest związany z drogowskazem, ponieważ inne odniesienia nie zawierają odniesienia do niego.
Wszelkie pomysły?
Interesujące. Dodanie 'System.setProperty (" http.keepAlive "," false ")' na początku testówki całkowicie rozwiązuje problem. Wszelkie sugestie dotyczące sposobu śledzenia http? Czy muszę korzystać z proxy rejestrowania, czy jest coś, co mogę zrobić bezpośrednio na kliencie? – emmby
Zobacz moją edycję .............. –
Potwierdzono, że jest to błąd Androida i śledzimy go tutaj: http://code.google.com/p/android/issues/ detail? id = 7786 –