微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

org.apache.http.entityutils#toString() 在有效载荷为空时分块传输编码的情况下导致 java.io.EOFException

如何解决org.apache.http.entityutils#toString() 在有效载荷为空时分块传输编码的情况下导致 java.io.EOFException

我的问题的标题非常概括了问题。我将尝试在此处提供更多详细信息:

我启用了 org.apache.http 日志,这是发送的请求:

 DEBUG Test worker org.apache.http.headers:136 - http-outgoing-1 >> Content-Type: application/x-www-form-urlencoded
 DEBUG Test worker org.apache.http.headers:136 - http-outgoing-1 >> Host: <host-address>
 DEBUG Test worker org.apache.http.headers:136 - http-outgoing-1 >> Connection: Keep-Alive
 DEBUG Test worker org.apache.http.headers:136 - http-outgoing-1 >> User-Agent: Apache-HttpClient/4.5.9 (Java/1.8.0_181)
 DEBUG Test worker org.apache.http.headers:136 - http-outgoing-1 >> Accept-Encoding: gzip,deflate
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 >> "GET /data/RestEndPoint('<unique-id>') HTTP/1.1[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 >> "Authorization: Bearer <Bearer-Token>[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 >> "Content-Type: application/x-www-form-urlencoded[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 >> "Host: trial-<Host-address>[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 >> "Connection: Keep-Alive[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 >> "User-Agent: Apache-HttpClient/4.5.9 (Java/1.8.0_181)[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 >> "Accept-Encoding: gzip,deflate[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 >> "[\r][\n]"

我从资源端点得到了有效的响应(在这种情况下,预计会得到 HTTP : 404 ) 这是来自服务器/端点的响应

 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "HTTP/1.1 404 Not Found[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "transfer-encoding: chunked[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "content-encoding: gzip[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "Strict-Transport-Security: max-age=31536000; includeSubDomains[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "X-Content-Type-Options: nosniff[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "x-frame-options: SAMEORIGIN[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "X-ServiceFabric: ResourceNotFound[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "X-Powered-By: ARR/3.0[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "Request-Context: appId=cid-v1:47532108-1d6f-4e03-9925-5a529abc43fe[\r][\n]"
 
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "0[\r][\n]"
 DEBUG Test worker org.apache.http.wire:73 - http-outgoing-1 << "[\r][\n]"
 DEBUG Test worker org.apache.http.headers:122 - http-outgoing-1 << HTTP/1.1 404 Not Found
 DEBUG Test worker org.apache.http.headers:125 - http-outgoing-1 << transfer-encoding: chunked
 DEBUG Test worker org.apache.http.headers:125 - http-outgoing-1 << content-encoding: gzip
 DEBUG Test worker org.apache.http.headers:125 - http-outgoing-1 << Strict-Transport-Security: max-age=31536000; includeSubDomains
 DEBUG Test worker org.apache.http.headers:125 - http-outgoing-1 << X-Content-Type-Options: nosniff
 DEBUG Test worker org.apache.http.headers:125 - http-outgoing-1 << x-frame-options: SAMEORIGIN
 
 DEBUG Test worker org.apache.http.headers:125 - http-outgoing-1 << X-ServiceFabric: ResourceNotFound
 DEBUG Test worker org.apache.http.headers:125 - http-outgoing-1 << X-Powered-By: ARR/3.0
 
 

直到现在一切正常,但以下代码块抛出异常:

httpentity entity = response.getEntity();

Arrays.stream(response.getAllHeaders())
      .forEach(head -> responseHeaders.put(head.getName(),head.getValue()));

responseEntity = (null != entity)
                ? EntityUtils.toString(entity,HttpConfigConstants.UTF8)
                : null;

EntityUtils.toString(entity,HttpConfigConstants.UTF8) 抛出以下异常:

 java.io.EOFException
        at java.util.zip.GZIPInputStream.readubyte(GZIPInputStream.java:268)
        at java.util.zip.GZIPInputStream.readUShort(GZIPInputStream.java:258)
        at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:164)
        at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:79)
        at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:91)
        at org.apache.http.client.entity.GZIPInputStreamFactory.create(GZIPInputStreamFactory.java:61)
        at org.apache.http.client.entity.LazyDecompressingInputStream.initWrapper(LazyDecompressingInputStream.java:51)
        at org.apache.http.client.entity.LazyDecompressingInputStream.read(LazyDecompressingInputStream.java:69)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        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:227)
        at org.apache.http.util.EntityUtils.toString(EntityUtils.java:270)
        at org.apache.http.util.EntityUtils.toString(EntityUtils.java:290)

EntityUtils 类不是检查空流吗? EntityUtils 中是否存在错误,或者我应该在调用 EntityUtils.toString(entity,HttpConfigConstants.UTF8) 之前检查什么,以便在有效响应期间不会屏蔽真正的 EOF 异常并避免不必要的 EOF 异常?


注意:如果成功的 http 响应代码也将抛出相同的 EOF 异常,并且没有有效负载,例如:201 (resource created: POST) 204 (resource updated: PATCH)

我应该如何避免这些?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。