我正在使用jetty HTTPClient和ContentExchange来实现代理。 ContentExchange有几个钩子方法,当加载某些响应时,可以重写这些钩子方法来执行代码。我的问题是将响应体从jetty Buffer加载到返回给客户端的HttpServletResponse对象。响应内容为JSON,较短的JSON正确导出到客户端,但更长的JSON未显示在响应中,并导致以下错误:SyntaxError:JSON.parse:第1行第1列的意外数据结尾JSON数据。文档没有显示outputStream对象的任何最大长度,所以我不确定为什么内容会被切断/不加载。
ContentExchange contentExchange = new ContentExchange() {
ServletOutputStream outputStream;
String contentString = "";
@Override
protected void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException {
super.onResponseStatus(version, status, reason);
httpResponse.setStatus(status);
remoteLRSRequest.setStatus(status);
remoteLRSRequest.setResponse(reason.toString());
}
@Override
protected void onResponseHeader(Buffer name, Buffer value) throws IOException {
super.onResponseHeader(name, value);
httpResponse.setHeader(name.toString(), value.toString());
}
@Override
protected void onResponseContent(Buffer content) throws IOException {
if (outputStream == null) {
outputStream = httpResponse.getOutputStream();
}
content.writeTo(outputStream);
outputStream.flush();
}
@Override
protected void onResponseComplete() throws IOException {
outputStream.close();
super.onResponseComplete();
}
}
注意:当我在调试器中单步执行此代码时,我可以看到加载到outputStream中的整个响应内容。但是,似乎flush()未正确提交响应数据。
答案 0 :(得分:0)
这是对实际问题的误诊。我正在转发的响应包含一个导致问题的“Transfer-Endcoding:chunked”标头。