मुझे लगता है कि एक लाइब्रेरी जिसका मैं उपयोग कर रहा हूं (साइनपॉस्ट 1.1-एसएनएपीएसएचओटी), एंड्रॉइड 1.5 पर एक अनोखी समस्या में चल रहा है, रिमोट सर्वर से लगातार दो कनेक्शन बनाता है। दूसरा कनेक्शन हमेशा एक HttpURLConnection.getResponseCode()
की -1
HttpURLConnection.getResponseCode() दूसरे आवेषण पर रिटर्न -1
यहाँ एक testcase कि समस्या को उजागर करता है के साथ विफल:
// 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);
}
}
असल में, अगर मैं अनुरोध करें और फिर पूरे इनपुट धारा उपभोग करते हैं, अगले अनुरोध के साथ असफल हो जायेगी -1 का परिणाम कोड अगर मैं इनपुट स्ट्रीम से सिर्फ एक वर्ण पढ़ता हूं तो विफलता प्रतीत नहीं होती है।
ध्यान दें कि यह किसी भी यूआरएल के लिए नहीं होता है - उपर्युक्त उपरोक्त विशिष्ट यूआरएल।
इसके अलावा, अगर मैं HttpURLConnection के बजाय HttpClient उपयोग भी कर, सब कुछ ठीक काम करता है:
// 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);
}
}
मैं क्या एक समान समस्या कहीं और हो रहा है के लिए references पाया है, लेकिन अभी तक कोई समाधान। यदि वे वास्तव में एक ही समस्या हैं, तो समस्या शायद साइनपॉस्ट के साथ नहीं है क्योंकि अन्य संदर्भ इसका कोई संदर्भ नहीं देते हैं।
कोई भी विचार?
दिलचस्प। टेस्टकेस की शुरुआत में 'System.setProperty (" http.keepAlive "," false ") जोड़ना पूरी तरह से समस्या हल करता है। http ट्रेस कैसे करें पर कोई सुझाव? क्या मुझे लॉगिंग प्रॉक्सी का उपयोग करने की ज़रूरत है, या क्या मैं क्लाइंट पर सीधे कुछ कर सकता हूं? – emmby
मेरा संपादन देखें .............. –
पुष्टि की कि यह एक एंड्रॉइड बग है, और हम इसे यहां ट्रैक कर रहे हैं: http://code.google.com/p/android/issues/ विस्तार? आईडी = 7786 –