首页 >后端开发 >Golang >为什么 Go 的 `http` 包在带有正文的 POST 请求中丢失取消信号?

为什么 Go 的 `http` 包在带有正文的 POST 请求中丢失取消信号?

Linda Hamilton
Linda Hamilton原创
2024-12-11 06:17:09127浏览

Why Does Go's `http` Package Miss Cancellation Signals in POST Requests with Bodies?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn