我们有一个网络服务器,它基本上接受 HTTP 发布请求,流式处理请求正文,并将请求正文上传到外部存储。
我们以一次 4KB 的速度从请求正文中读取并处理它们,并将它们上传到外部存储(同时)。在处理过程中,如果我们读取的字节失败了我们的业务逻辑,我们使用ctx
生成的context.WithCancel(Request().Context())
来取消请求。这也将取消上传。如果上下文已被取消,我们也会在这种情况下返回 400 响应。
问题是,当我们测试我们的 Web 服务器时,我们的客户端有时会收到 104 错误:如果对等方发出的请求会使我们的业务逻辑失败,则连接重置。我们不确定此响应来自何处,因为我们返回的是 400 响应。
我在网上做了一些研究,发现这可能是服务器没有完全读取和使用请求正文的情况。当未使用的数据量达到 TCP 缓冲区大小时,TCP 将关闭连接,这就是我们收到此 109 错误的原因。有谁知道是否是这种情况?