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

时间:2018-08-21 09:39:31

标签: http go server

我有一台net/http服务器(通过ServeHTTP()服务于GET请求,这可能需要很长时间才能完成。因此,没有在服务器端配置客户端超时。但是,已连接的客户端可能已关闭其与服务器的连接(通常是由于服务器端超时,但是当然也可能有其他原因)。我无法控制客户。

如何在ServeHTTP()中检测这种情况而不会“干扰”连接?

  • 我无法发送一系列1xx响应标头,因为ResponseWriter.WriteHeader()不支持它(而且,它只允许设置一个标头,不返回任何内容)。
  • 我不能对大小为零的数据使用ResponseWriter.Write(),因为那样会发送标头。

我还有什么其他选择?

编辑:这不是how to close/abort a Golang http.Client POST prematurely的重复,因为那里的问题是如何从客户端取消请求,而我的问题是要从服务器端检测到这种取消。

1 个答案:

答案 0 :(得分:5)

询问request context

  

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

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