代码之家  ›  专栏  ›  技术社区  ›  Darron

如果我愿意关闭连接,如何通过分块HTTP repsonse报告中间的错误?

  •  1
  • Darron  · 技术社区  · 17 年前

    (见相关问题: How do I report an error midway through a chunked http repsonse without closing the connection? )

    在我的例子中,1希望浏览器显示一条错误消息。无论多么不具建设性。

    关闭servletResponse输出流显然不起作用。也不会抛出异常,即使我没有首先关闭(在Tomcat6.0.16上测试)。我认为我想要的要么是第一个数据包,要么是块中间的fin,要么是格式不好的块头。

    之后,我可以担心各种浏览器的响应。

    为澄清而编辑:这是一个文件下载,可能是几千兆字节的二进制数据。在我开始发送一些数据之前,我不能保证所有的数据都能被成功地读取或解密。

    3 回复  |  直到 17 年前
        1
  •  1
  •   Darron    17 年前

    我自己的答案,经过研究。

    第一部分:似乎没有办法让应用服务器相信我测试过的将错误放在“提交”阶段之后的线路上。以下servlet代码在套接字上导致合法的HTTP分块传输头。有趣的是,在WebSphere的情况下,一条错误消息被附加到流末尾的结束标记之前。

    public class Servlet extends HttpServlet {
        public static final int ARRAY_SIZE = 65536;
        private static final int SEND_COUNT = 100000;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
    
            String testData = "This is a fairly long piece of test text, running on and on and on, over and over.";
    
            final ServletOutputStream outputStream = response.getOutputStream();
            for (int i = 0; i < SEND_COUNT; ++i) {
                outputStream.println(testData);
            }
            throw new ServletException("Break it now");
        }
    }
    

    第二部分:即使应用服务器愿意在不关闭零长度块的情况下将虚假数据写入线或关闭套接字,普通客户机也不会报告错误。IE7、FF3和CURL不报告块编码中的错误。这使得HTTP下载天生不可靠,如果不是HTTP 1.1 RFC的字母,则与此相反。

        2
  •  0
  •   davr    17 年前

    我觉得你做错事了。在确定是成功还是失败之前,不真正开始发送数据似乎更简单。这样,如果需要,您可以在开始时发送错误消息,而不是发送无效的部分数据。

    如果你真的必须这样做,你也许可以用JavaScript来解决一些问题。当您遇到错误时,在关闭连接之前输出如下内容:

    <script type="text/javascript"> alert("Processing failed!"); </script>
    

    您可能希望扩展脚本,但是您得到了一般的想法。假设发送回浏览器的是一个HTML页面,您没有在问题中指定。

        3
  •  0
  •   johnstok    17 年前

    servlet API不允许这样做。一旦提交了响应,就发送了响应代码。最好关闭连接并记录错误。