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

标签 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);
}

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

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

谢谢

最佳答案

应执行以下操作之一:

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

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

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

关于http - 流式传输 Http 请求的主体时如何处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15305203/

相关文章:

network-programming - 检查 WebRTC 连接 - 可靠的方法

objective-c - 在带有协议(protocol)和委托(delegate)的 viewDidLoad 之后,字符串变为 nil

HTTP 书籍推荐?

http - 无法向 SO 发出 http get 请求

http - 您可以在 Google+ html 源中看到的那些以//- 开头的网址是什么?

ios - 应该在哪里快速声明协议(protocol)?

tcp - 多个 "TCP/IP"模型层的校验和字段的设计需要?他们真的是多余的吗?

ios - 带有 "where"的协议(protocol)导致崩溃

javascript - Angular Http 订阅 - 无法分配给组件中的变量

android - 如何在 Android 中从服务器检索数据时滚动更新 ListView?