39

当客户端在发出 HTTP 请求时取消 TCP 连接时,我想停止在服务器上执行任何工作并返回空响应。这样的响应应该返回什么 HTTP 状态码?

4

4 回答 4

44

为了保持一致,我现在建议400 Bad Request如果您的后端应用程序能够识别客户端何时断开连接,或者您拒绝或关闭连接,您可能会返回 Nginx 的非标准代码 499 或 444。

  • 499 Client Closed Request 当客户端在服务器可以发送响应之前关闭请求时使用。

  • 444 No Response 用于表示服务器没有向客户端返回任何信息并关闭了连接。

于 2017-09-22T09:51:54.593 回答
18

HTTP (1.0/1.1) 无法取消请求。如果客户端不再需要响应,它所能做的就是关闭连接并希望服务器包含优化以停止处理无法再传递的响应。由于连接现在已关闭,实际上无法将响应或状态代码传递给客户端,因此您“返回”的任何代码都只是为了您自己的满意。我个人会选择 4xx 范围1中的东西,因为“故障”——您无法再提供响应的原因——是由于客户造成的。

HTTP 2.0 确实允许端点发出END_STREAMRST_STREAM指示他们不再对一个流感兴趣,而无需断开整个连接。但是,它们的目的是忽略任何进一步的HEADERSDATA在该流上发送的内容,因此即使理论上您可以提供状态代码,客户端仍然会完全忽略它。


1可能是 400 本身,因为我无法确定似乎完全合适的更具体的错误。

于 2017-09-18T08:50:42.223 回答
5

只有几个可能的选择(当然,除了 500 个):

  1. 202 接受

    你还没有完成处理,你永远不会。

    仅当在您的应用程序域中,原始请求者“预期”并非所有请求都会得到满足时,这才是合适的。

  2. 409 冲突

    …在提出和取消请求之间。

    这只是微不足道的理由:您的情况不涉及一位客户根据过时的信息提出请求,因为取消尚未发生。

  3. 503服务不可用

    该服务实际上对这一请求不可用(因为它已被取消!)。

“将错误报告为错误”的一般参数有利于 409 或 503。因此默认情况下为503 。

于 2017-09-18T08:31:47.107 回答
4

真的没什么可做的。引用RFC 7230,第 6.5 节

客户端、服务器或代理可以随时关闭传输连接。

这发生在 TCP 级别,而不是 HTTP 级别。只需停止处理连接。状态码在这里几乎没有什么意义,因为不完整/中断请求的意图只是推测。此外,将无法将其传输给客户。

于 2017-09-22T13:15:27.347 回答