HTTP是否允许服务器在接收完整个请求体之前就发送响应?

5
在HTTP/1.1标准中,服务器在接收完所有请求数据之前发送响应是否被明确允许或禁止?
例如,在使用POST请求上传大量数据时,我可以想象服务器在接收到请求头后返回“202 ACCEPTED”响应,但在接收完整个正文之前。这是合法的还是不合法的?这种情况是否存在于现实中?
服务器是否可以在接收完整个请求之前发送HTTP响应?密切相关,但那里的响应似乎侧重于处理“错误”(4xx、5xx可能),而不是“成功”(2xx)。

2
我不了解规范,但似乎很自然的是,“成功”响应应该在完全接收请求后才发送。毕竟,错误可能出现在正文末尾,假设它将是正确的会很奇怪。这与我们可以早期检测和响应的"错误"情况形成对比。而且大多数客户端(包括浏览器)都会这样假定,因此要么在发送请求后处理响应,要么在早期响应上完全失败。实际上,我认为即使在“错误”的情况下他们也会这样做。 - freakish
3
你曾考虑过阅读 HTTP 1.1标准吗?你的问题可以在那里找到答案,就在第6节的开头,你应该去看看。 - user207421
无论如何,这完全是不切实际的。RFC 2616默认要求持久连接,而HTTP服务器除非已经读取了所有先前的请求,否则无法读取第二个或后续的请求。如果它关闭了带有未读数据的连接而不是保持连接,则TCP将重置该连接,这可能会导致传出响应数据的丢失。因此,无论是否需要,都无法实现。 - user207421
谢谢您的评论。但是“100继续”怎么样?在接收正文之前发送此消息。这是仅限于1xx响应的特殊情况吗? - Sylvain Leroux
根据HTTP 1.1标准p47的规定:“源服务器在发送100(继续)响应之前不能等待请求体。如果它回复了最终状态码,则可以关闭传输连接,也可以继续。”“如果它回复了最终状态码[...]它可以继续”这个语句难道不意味着最终代码可能会在完全处理请求之前发送吗? - Sylvain Leroux
2个回答

3

第15.2节 - 在请求操作完成之前,您可以发送信息响应。

例如,状态码100表示已经部分接收了请求,但并非全部接收。


3
在HTTP/1.1标准中,服务器在接收到请求的所有数据之前发送响应是否被明确允许或禁止? 是的,它是被允许的,但这取决于情况。例如,服务器允许在接收到请求的全部内容之前发送1xx响应。我们可以得出结论,服务器不仅被允许发送1xx响应,而且实际上被鼓励这样做。 HTTP响应的整个类别的存在不是偶然的 - 它们是专门为在请求完成之前向客户端发送响应而添加到规范中的。1xx(信息)状态代码的存在表明,在完成所请求的操作并发送最终响应之前,用于传达连接状态或请求进度的过渡性响应。
对于2xx响应,只有在完整请求被接收后服务器才应该发送这些响应。这意味着如果请求尚未被接收,服务器不应该(也不会)响应2xx。

2xx(成功)状态代码类表明客户端的请求已经成功接收、理解和接受。

还有关于3xx、4xx和5xx的其他细节,但是通过上面的1xx和2xx示例,我们可以看到服务器可以在请求完成之前发送响应的情况,以及服务器不应该在请求被接收之前发送响应的情况。 更新: 来自HTTP/1.1 RFC的第10.1.1节 "100 Continue" 包含了以下内容,清楚地描述了服务器在请求过程中响应的情况:
客户端应该继续发送请求。这个临时响应用于通知客户端请求的初始部分已被服务器接收并且还未被拒绝。如果请求已经完成,客户端应该继续发送请求的其余部分;否则可以忽略这个响应。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接