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

use*_*161 23 protocols http

如何在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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

jdb*_*jdb 19

以下之一应该这样做:

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

这取决于您希望客户对数据做什么(保留或丢弃它).您可能无法在客户端进行更改,因此最后一个选项不起作用.

以下是关于不同关闭方式的一些解释.TCP选项SO_LINGER(零) - 何时需要.


zzk*_*zzk -10

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

服务器错误 5xx

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

  • 然而,这并不总是可能的。例如:如果我正在传输一个大文件,并且我在硬盘驱动器上找到了该文件,我将发送“200 OK”标头,然后开始从硬盘驱动器流式传输文件(主内存中没有整个文件)读取文件时可能会出现错误。 (6认同)
  • 是的,但重点是我已经发送了请求的标头。 (3认同)