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

Ale*_*uer 3 http go server

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

如何在ServeHTTP()不"干扰"连接的情况下检测到这种情况?

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

我还有其他选择吗?

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

Pet*_*ter 5

询问请求上下文:

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

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