首页 > 后端开发 > Golang > 为什么 Go 的 HTTP 上下文无法检测到带有请求主体的取消信号?

为什么 Go 的 HTTP 上下文无法检测到带有请求主体的取消信号?

DDD
发布: 2024-12-08 02:43:10
原创
589 人浏览过

Why Doesn't Go's HTTP Context Detect Cancellation Signals with Request Bodies?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板