在不关闭连接的情况下,如何在分块的HTTP响应中报告错误?
时间:2020-03-06 15:01:58 来源:igfitidea点击:
我有一个HTTP服务器,该服务器返回较大的主体以响应POST请求(它是SOAP服务器)。这些实体通过分块"流式传输"。如果在流式传输的过程中遇到错误,我如何向客户端报告该错误并仍然保持连接打开状态?该实现使用专有的HTTP / SOAP堆栈,因此我对HTTP协议级别的答案感兴趣。
解决方案
服务器将状态行(响应的第一行)发送给客户端后,就无法再更改响应的状态代码。许多服务器通过在内部缓冲直到缓冲区已满来延迟发送响应。当缓冲区填满时,我们仍然可以改变主意。
如果客户端可以访问响应标头,则可以使用以下事实:分块编码允许服务器在分块编码的正文之后添加带有标头的预告片。因此,遇到错误的服务器可以正常停止发送正文,然后发送将某些标头设置为某个值的预告片。然后,客户端会将此标头的存在解释为发生错误的迹象。
只要response.iscommitted()返回false,就可以更改状态代码。
(在Java中选择HttpServletResponse,确保存在其他语言的等效项)
还请记住,分块的响应可以包含"页脚",就像HTTP标头一样。失败后,我们可以发送页脚,例如:
X-RealStatus: 500 Some bad stuff happened
或者,如果我们成功:
X-RealStatus: 200 OK