如何非破坏性地检查HTTP客户端是否已经关闭连接?

7
我有一个使用net/http服务器处理GET请求(通过ServeHTTP()),该请求可能需要很长时间才能完成。因此,服务器端未配置客户端超时。但是,连接的客户端可能已关闭其与服务器的连接(通常是由于其一侧的超时,但当然也可能是其他原因)。我无法控制客户端。
如何在ServeHTTP()中检测这种情况而不“干扰”连接?
  • 我不能发送一系列1xx响应头,因为ResponseWriter.WriteHeader()不支持它(而且仅允许设置一个标题并且不返回任何内容)。
  • 我不能使用带零大小数据的ResponseWriter.Write(),因为那样会发送头。
我有哪些其他选项?

编辑:这不是如何在Golang http.Client POST过早地关闭/中止请求的重复问题,因为那里的问题是如何从客户端取消请求,而我的问题是关于在服务器端检测到这种取消。


可能是如何提前关闭/中止Golang http.Client POST请求的重复问题。 - Jonathan Hall
1
非常清晰。谢谢。不过它仍然是一个重复的问题 :) - Jonathan Hall
1个回答

10

审问请求上下文

对于传入服务器请求,当客户端的连接关闭、请求被取消(使用HTTP/2),或ServeHTTP方法返回时,上下文将被取消。

var r *http.Request
select {
    case <-r.Context().Done():
        // Client gave up
    default:
}

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