HTTP:200 OK状态代码后的回复期间出错

时间:2013-05-24 17:21:08

标签: http http-status-codes

作为HTTP 1.1服务器,我回复具有200 OK状态代码的GET请求,然后开始将数据发送到客户端。 在此发送过程中,发生错误,我无法完成。

我无法发送新的状态代码,因为最终状态代码已经发送。

我应该如何让客户知道发生了错误,我无法继续处理此HTTP请求?

我只能想到一个解决方案:关闭套接字,但它并不完美:它打破了keep-alive功能,并且没有给客户端错误的明确解释。

HTTP标准似乎假设服务器在开始回复之前已经确切知道要回复的内容。 但情况并非总是如此。 例子: 我从磁盘返回一个非常大的文件(几GB),在读取文件期间的某个时刻出现IO错误。 与大型数据库转储相同的示例。

我无法在内存中构建我的整个响应然后发送它。

HTTP 1.1标准有助于使用分块传输编码:在开始发送回复之前,我甚至不需要知道最终大小。 因此,HTTP 1.1不排除这些用法。

2 个答案:

答案 0 :(得分:2)

我终于找到了一个可能的解决方案: HTTP 1.1 Trailer headers

在分块编码体中,HTTP 1.1允许发送者以标题块的形式在最后一个(空)块之后添加数据。 该规范暗示了一些用例,例如在运行中计算身体的md5,并将其发送到身体之后,以便客户端可以检查其完整性。

我认为它可以用于错误报告,即使我没有找到任何关于此类用法的内容。

我看到的问题是:

  • 这需要使用分块编码(但这不是问题)
  • 预告片支持可能非常低:
    • 服务器端(可以通过手动创建分块编码来绕过它,但由于它是在内容编码(gzip)之后应用的,因此需要大量重新实现)
    • 客户端(例如,仅在2010 in curl中修复了错误)
    • 和代理(如果没有正确实施,可能会松散预告片)

答案 1 :(得分:1)

我已经推出了类似的问题,所以在这里你可以发现没有解决方案

How to tell there's something wrong with the server during response that started as 200 OK. Fail gracefully