流式传输Http请求的主体时如何处理错误

时间:2013-03-08 23:39:50

标签: http protocols

如何在Http消息中处理服务器错误?

假设我已经发送了消息的标题,我正在流式传输 消息的正文,当我遇到意外错误时该怎么办。

我还假设这个错误是在生成内容时引起的,而不是连接错误。

(很大程度上)简化代码:

// I can define any transfer encoding or header fields i need to.
send(header);  // Sends the header to the Http client.

// Using an iterable instead of stream for code simplicity's sake.
Iterable<String> stream = getBodyStream();
Iterator<String> iterator = stream.iterator();

while (iterator.hasNext()) {
    String string;
    try {
       string = iterator.next();   
    catch (Throwable error) { // Oops! an error generating the content.
        // What do i do here? (In regards to the Http protocol)
    }

    send(string);
}

有没有办法告诉客户端服务器失败,应该重试还是放弃连接,还是我是sool?

代码大大简化,但我只询问协议而不是确切的代码。

谢谢

2 个答案:

答案 0 :(得分:19)

以下其中一项应该这样做:

  1. 关闭连接(重置或正常关闭)
  2. 编写一个格式错误的块(并关闭连接),这将触发客户端错误
  3. 添加http trailer告诉您的客户出现了问题。
  4. 更改您的更高级别协议。您发送的最后一段数据是散列或长度,客户端知道要处理它。
  5. 如果您在开始发送之前可以生成内容的哈希值或长度(如果使用http块,则在自定义标头中),您可以将其发送到标题中,以便客户知道会发生什么。
  6. 这取决于您希望客户对数据做什么(保留或丢弃它)。您可能无法在客户端进行更改,因此最后一个选项不起作用。

    以下是关于不同关闭方式的一些解释。 TCP option SO_LINGER (zero) - when it's required

答案 1 :(得分:-5)

我认为服务器应该根据RFC 2616返回响应代码以5xx开头。

  

服务器错误5xx

     

以数字“5”开头的响应状态代码表示服务器知道它已经出错或无法执行请求的情况。除了在响应HEAD请求时,服务器应该包括一个实体,其中包含错误情况的解释,以及它是临时或永久条件。用户代理应该向用户显示任何包含的实体。这些响应代码适用于任何请求方法。