我有一台net/http
服务器(通过ServeHTTP()
服务于GET请求,这可能需要很长时间才能完成。因此,没有在服务器端配置客户端超时。但是,已连接的客户端可能已关闭其与服务器的连接(通常是由于服务器端超时,但是当然也可能有其他原因)。我无法控制客户。
如何在ServeHTTP()
中检测这种情况而不会“干扰”连接?
1xx
响应标头,因为ResponseWriter.WriteHeader()
不支持它(而且,它只允许设置一个标头,不返回任何内容)。ResponseWriter.Write()
,因为那样会发送标头。我还有什么其他选择?
编辑:这不是how to close/abort a Golang http.Client POST prematurely的重复,因为那里的问题是如何从客户端取消请求,而我的问题是要从服务器端检测到这种取消。
答案 0 :(得分:5)
对于传入的服务器请求,当客户端的连接关闭,请求被取消(使用HTTP / 2)或ServeHTTP方法返回时,上下文将被取消。
var r *http.Request
select {
case <-r.Context().Done():
// Client gave up
default:
}