Go http 包:在带有 Bodies 的请求中捕获取消信号
问题:为什么 Go http 包无法捕获 POST 的取消信号带body的请求?
答案:Go的http服务器读取请求body来检测客户端何时关闭 联系。在读取正文之前,不会检查是否已关闭连接。
因此,要正确处理此问题,请尽快读取请求正文,即使请求处理逻辑中不需要它。
解决方案:
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()) io.Copy(ioutil.Discard, r.Body) // Read the body to detect the closed connection time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
当客户端提前关闭连接时,此代码将检测到它并取消任何正在进行的工作。
以上是为什么 Go 的 `http` 包在带有正文的 POST 请求中丢失取消信号?的详细内容。更多信息请关注PHP中文网其他相关文章!