0

我正在實施一個與GitHub API進行通信的應用程序,以便推斷當前開發的項目的一些統計信息。我選擇使用HttpAsyncClient異步發出請求。當試圖讀取HttpResponse的內容時出現SSLException

我的問題是,在我執行的所有請求,並得到所有從API的響應(其中約150),我嘗試後〜讀取與

String content = EntityUtils.toString(response.getEntity()); 

我得到以下異常SSLException內容120回覆如下:

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()進行了檢查,並且它一直運行至響應列表的最後。 即使我在finally塊中刪除httpClient.shutdown()(在讀取內容之前執行該塊),問題仍然存在。

從堆棧跟蹤,我的結論是,異常就行

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

拋出是在HttpResponse實體越來越莫名其妙過時?你在我的推理中看到錯誤嗎?什麼可能是爲什麼前120個響應被正確解析然後SSLException被拋出的原因?

任何幫助,將不勝感激:)

回答

0

這也可能是取決於你的OpenSSL版本。在我維護的python項目中,當人們在很短的時間內發出大量的SSL請求時,我們發現openssl 0.9.8存在錯誤。無可否認,這與您的錯誤信息毫無關係,但升級到openssl 1.0可能會有所幫助。

相關問題