作为 HTTP 1.1 服务器,我使用 200 OK 状态代码回复 GET 请求,然后开始将数据发送到客户端。
在此发送过程中,发生错误,我无法完成。
我无法发送新的状态代码,因为最终状态代码已发送。
我应该如何让客户端知道发生了错误并且我无法继续此 HTTP 请求?
我只能想到一种解决方案:关闭套接字,但它并不完美:它破坏了保持活动功能,并且没有向客户端提供对该错误的明确解释。
HTTP 标准似乎假设服务器在开始回复之前就已经确切知道要回复什么。
但情况并非总是如此。
例子:
我从磁盘返回一个非常大的文件(几 GB),并且在读取文件期间的某个时刻出现 IO 错误。
与大型数据库转储相同的示例。
我无法在内存中构建我的整个回复然后发送它。
HTTP 1.1 标准有助于使用分块传输编码:我什至不需要在开始发送回复之前知道最终大小。
所以这些用法并没有被排除在 HTTP 1.1 之外。
我终于找到了一个可能的解决方案:HTTP 1.1 尾部标头 https://www.rfc-editor.org/rfc/rfc2616#section-14.40.
在分块编码主体中,HTTP 1.1 允许发送方以标头块的形式在最后一个(空)块之后添加数据。
该规范暗示了一些用例,例如动态计算正文的 md5,并在正文之后发送它,以便客户端可以检查其完整性。
我认为它可以用于错误报告,即使我还没有发现任何关于这种用法的信息。
我看到的问题是:
- 这需要使用分块编码(但这不是什么大问题)
- 预告片的支持可能非常低:
- 服务器端(可以通过手动创建分块编码来绕过它,但由于它是在内容编码(gzip)之后应用的,因此需要大量重新实现)
- 客户端(仅修复的错误2010年卷曲 http://curl.haxx.se/changes.html例如)
- 以及代理(如果实施不当,可能会丢失预告片)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)