EOFException: \n not found: limit=0 content和java.net.ProtocolException: unexpected end of stream问题处理
EOFException: \n not found: limit=0 content和java.net.ProtocolException: unexpected end of stream问题处理
问题说明: 项目中有一个需求,需要在请求处理成功后,获取响应数据,修改业务错误时响应的信息。于是我在filter中包装了ServletResponse改写了body数据。服务端没有报错。结果客户端请求就出现了该错误。客户端使用的OKhttp发起的请求。用原始ServletResponse和包装后的ResponseWrapper报的错不一样。
报错信息如下:
com.xxx.acc.openapi.client.exception.AccValidException: unexpected end of stream
at com.xxx.acc.openapi.client.util.CommonUtils.readAsBytes(CommonUtils.java:183)
at com.xxx.acc.openapi.client.util.CommonUtils.readAsString(CommonUtils.java:203)
at com.xxx.acc.openapi.client.util.CommonUtils.readAsJSON(CommonUtils.java:216)
at com.xxx.acc.openapi.client.Client.doRequest(Client.java:622)
at com.xxx.acc.openapi.client.Client.callApi(Client.java:661)
at com.xxx.acc.openapi.api.AccClient.request(AccClient.java:64)
at com.xxx.acc.open.apidoc.test.DemoAccClientUtils.request(DemoAccClientUtils.java:114)
at com.xxx.acc.open.apidoc.test.DemoAccClientUtils.requestBody(DemoAccClientUtils.java:74)
at com.xxx.acc.open.apidoc.test.Demo2.main(Demo2.java:49)
Caused by: java.net.ProtocolException: unexpected end of stream
at okhttp3.internal.http1.Http1ExchangeCodec$FixedLengthSource.read(Http1ExchangeCodec.java:430)
at okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.java:286)
at okio.RealBufferedSource$1.read(RealBufferedSource.java:447)
at java.io.InputStream.read(InputStream.java:101)
at com.xxx.acc.openapi.client.util.CommonUtils.readAsBytes(CommonUtils.java:175)
... 8 more
通过debug客户端OKhttp代码,发现如下代码会导致报错
try {
……..
bytesReceived = newBytesReceived;
if (newBytesReceived == contentLength) {
complete(null);
} return read;
} catch (IOException e) {
throw complete(e);
}
由此判定,当response的请求头contentLength参数值与客户端获取body数据的值不同时会报该错误。
解决方法: 后端在响应数据时,根据响应数据长度,重新设置response.contentLength值即可
servletResponse.setContentLength(resData.getBytes(StandardCharsets.UTF_8).length);