如何避免来自HttpURLConnection的空HTTP响应的EOFException?

时间:2013-02-11 17:18:30

标签: java http exception inputstream httpurlconnection

我正在向服务器发送HTTP请求,该服务器合法地返回HTTP响应代码= 200(OK)的空白响应。

但是这会导致下面标记的行抛出EOFException

InputStream responseStream = httpURLConnection.getInputStream();
final String contentEncoding = this.connection.getContentEncoding();
if ("gzip".equalsIgnoreCase(contentEncoding)) {
    responseStream = new GZIPInputStream(responseStream); // throws EOFException
}

可能有一种明显的方法可以防止这种情况,但我找不到它。在创建GZIPInputStream之前,我是否应该检查connection.getContentLength() > 0responseStream.available() > 0之类的内容?这些似乎都不对,我在示例代码片段中没有遇到任何类似的内容......

4 个答案:

答案 0 :(得分:3)

  

我是否应该检查一下像connection.getContentLength()> 0

  

或responseStream.available()> 0

绝对不是。 available()== 0不是EOF的有效测试,Javadoc明确地这样说。

答案 1 :(得分:1)

您的服务器不应该返回HTTP代码204(无内容)而不是200吗?除了HEAD请求之外。见Http Status Code definition

除此之外,您确实可以检查以解决看起来不太合规的服务器实现,或捕获异常,然后根据您发送的请求类型确定正确的操作。

答案 2 :(得分:1)

我从您的问题中了解到,每次从服务器收到200响应时,都会异常抛出此异常。

如果responseStream.available() > 0不是一个选项,则意味着该流实际上包含某些内容,但该流似乎不完整或通过任何其他方式提前结束,因为available表示存在可读字节在溪流中。


更新

根据您的评论(以及纯粹的好奇心再次阅读InputStream的文档后),我也相信connection.getContentLength() > 0是可行的方法。如果你使用的是Java 7,那么connection.getContentLengthLong()比那更好,因为它直接返回long

鉴于文档对InputStream#available的评价:

  

类InputStream的可用方法始终返回0.

  

请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会。使用此方法的返回值来分配用于保存此流中所有数据的缓冲区绝对不正确。

这会将检查作为选项丢弃。

答案 3 :(得分:0)

除非我遗漏了某些内容,否则根据定义,内容编码“gzip”的响应不能为空。