尝试读取HttpResponse的内容时SSLException

时间:2013-03-28 08:56:28

标签: httpresponse github-api apache-commons-httpclient sslexception

我正在实现一个与GitHub API通信的应用程序,以推断出当前开发的项目的一些统计信息。我选择使用HttpAsyncClient异步发出请求。

我的问题是,在我执行所有请求并获取API的所有响应(大约150个)后,我尝试用

读取内容
String content = EntityUtils.toString(response.getEntity());

在读取了~120个响应后,我正在跟踪SSLException:

Exception in thread "main" javax.net.ssl.SSLException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:557)
at sun.security.ssl.InputRecord.read(InputRecord.java:509)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:883)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:840)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:94)
at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:204)
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:182)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:282)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:324)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:176)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.Reader.read(Reader.java:140)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:224)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:264)
at pl.xsolve.githubmetrics.github.OwnGitHubClient.extractBodyFromResponse(OwnGitHubClient.java:117)

当我显着减少请求数量(例如,减半)时,问题就消失了。此外,所有回复都包含HTTP/1.1 200 OK - 我已使用response.getStatusLine()进行了检查,并且一直有效,直到响应列表的最后。 即使我删除httpClient.shutdown()块中的finally(在读取内容之前执行),问题仍然存在。

从堆栈跟踪中,我得出结论,该行异常被抛出

while((l = reader.read(tmp)) != -1)

HttpResponse中的实体是否过时了?你在推理中看到错误吗?可以正确解析前120个响应然后抛出SSLException的原因是什么?

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

这也可能取决于您的openssl版本。在我维护的python项目中,当人们在短时间内发出大量SSL请求时,我们在openssl 0.9.8中看到了错误。不可否认,这与您的错误消息完全不同,但升级到openssl 1.0可能有所帮助。