当前位置: 首页 > 知识库问答 >
问题:

输出流。flush()未将响应数据提交到HttpServletResponse

潘胤
2023-03-14

我正在使用jetty HTTPClient和ContentExchange来实现代理。ContentExchange有几个钩子方法,当加载响应的某些部分时,可以覆盖这些钩子方法来执行代码。我的问题是从jetty Buffer将响应正文加载到返回给客户端的HttpServletACK对象。响应内容是JSON,较短的JSON正确导出到客户端,但较长的JSON不会在响应中显示,并导致以下错误:语法错误:JSON.parse:JSON数据的第1行第1列的数据意外结束。留档不显示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() 似乎没有正确提交响应数据。

共有1个答案

唐昊焜
2023-03-14

这是对实际问题的误诊。我中继的响应包含一个“传输-结束编码:分块”标头,该标头导致问题。

 类似资料:
  • 我的应用程序实现了VpnService来拦截流量并提供量身定制的响应。目标是处理到特定地址的流量,并丢弃其他请求。 目前,我成功地解析了传入的请求,构建并发送了响应。然而,问题是这些响应并不是对原始请求的实际响应;使用套接字连接进行测试只是超时。 为了进行这一区分,我目前正在解析VPN服务输入流中的原始IP数据包,如下所示: IpDatagram是一个类,通过它可以将字节数组解析为IP数据包的表示

  • 我试图使用Spring 4实现简单的Web服务。但是我的用户服务似乎不起作用。 我有如下配置: 我的内存HSQLDB的持久性配置如下: 我有一个实体。这是我的存储库: 我还在9999端口上安装了一个嵌入式jetty来运行这项服务。 当jetty启动时,我转到或或类似的smth,就会出现错误404方法也不起作用。 我认为这是因为Servlet Dispatcher不知道我公开的存储库。但我也不知道如

  • 响应输出 大多数情况,我们不需要关注Response对象本身,只需要在控制器的操作方法中返回数据即可,系统会根据default_return_type和default_ajax_return配置自动决定响应输出的类型。 默认的自动响应输出会自动判断是否AJAX请求,如果是的话会自动输出default_ajax_return配置的输出类型。 最简单的响应输出是直接在路由闭包或者控制器操作方法中返回一

  • 问题内容: 是否可以在Struts2的操作中将表单的数据提交到Java Set? 动作代码: 表单代码: 问题答案: 该仅仅是一个集合,Struts2的对任何类型的集合的内部支持。但是对于这种类型的集合,您不能在OGNL表达式中使用索引。尝试

  • HTTP 响应报文分为三个部分: 响应行 响应头 响应体 对于 HTTP 响应体的输出,在 OpenResty 中调用 ngx.say 或 ngx.print 即可。经过查看官方 wiki ,这两者都是输出响应体,区别是 ngx.say 会对输出响应体多输出一个 \n 。如果你用的是浏览器完成的功能调试,使用这两着是没有区别的。但是如果使用各种终端工具,这时候使用 ngx.say 明显就更方便了。