Go HTTP 上下文无法检测到带有请求体的取消信号
在 Go 的 HTTP 服务器中,上下文信号可以提供一种处理客户端断开连接的机制,让服务器及时清理资源。但是,当请求包含正文时,上下文的 Done 通道会停止,从而阻止服务器检测客户端的离开。
行为原因
此行为的原因关键在于HTTP服务器如何读取连接。在读取请求正文之前,不会执行对已关闭连接的检查。对于 GET 请求,不存在正文,因此服务器会主动监视连接。但是,对于 POST 请求,正文会占用非阻塞读取器,从而延迟连接检查。
解决方案
要解决此问题,请显式读取以下请求正文处理函数。此操作会触发服务器的连接监控,确保能够及时检测到客户端断开连接。
代码示例
func handler(w http.ResponseWriter, r *http.Request) { go func(done <-chan struct{}) { <-done fmt.Println("message", "client connection has gone away, request got cancelled") }(r.Context().Done()) // Explicitly read the body to trigger connection monitoring io.Copy(ioutil.Discard, r.Body) time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
此修改提示服务器读取请求体立即启动连接监控过程。因此,即使存在请求正文,服务器现在也可以有效地检测客户端断开连接。
以上是为什么 Go 的 HTTP 上下文无法检测到带有请求主体的取消信号?的详细内容。更多信息请关注PHP中文网其他相关文章!