当我使用的库(路标1.1-SNAPSHOT)与一个远程服务器建立两个连续连接时,我似乎在Android 1.5上遇到了一个特殊问题。第二个连接始终失败了HttpURLConnection.getResponseCode()的-1HttpURLConnection.getResponseCode()在第二次调用时返回-1

下面是暴露问题的测试用例:

// 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。如果我只是从输入流中读取一个字符,失败似乎不会发生。

请注意,这不会发生任何网址 - 只是具体的网址,如上面的一个。

另外,如果我切换到使用HttpClient的,而不是HttpURLConnection的,一切工作正常:

// 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什么似乎是一个类似的问题在其他地方,但至今没有解决方案。如果他们真的是同一个问题,那么问题可能不是路标,因为其他参考文献没有提及它。

任何想法?

2009-09-17

emmby

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐