36

如何处理 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);
}

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

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

谢谢你

4

2 回答 2

25

以下其中一项应该做到这一点:

  1. 关闭连接(重置或正常关闭)
  2. 编写格式错误的块(并关闭连接),这将触发客户端错误
  3. 添加一个http 预告片,告诉您的客户出了点问题。
  4. 更改您的更高级别的协议。您发送的最后一条数据是散列或长度,客户端知道要处理它。
  5. 如果您可以在开始发送之前生成内容的哈希或长度(如果使用 http 块,则在自定义标头中),您可以在标头中发送它,以便您的客户知道会发生什么。

这取决于您希望客户如何处理数据(保留或丢弃)。您可能无法在客户端进行更改,因此例如最后一个选项将不起作用。

以下是有关关闭的不同方式的一些说明。TCP 选项 SO_LINGER(零)- 需要时

于 2013-03-09T00:22:57.410 回答
-8

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

服务器错误 5xx

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

于 2013-03-08T23:53:41.087 回答