Go 是否可以在Gin服务器中处理客户端套接字事件关闭(基于net/http包)?

Go 是否可以在Gin服务器中处理客户端套接字事件关闭(基于net/http包)?,go,Go,使用HTTP服务器。是否可以处理客户端套接字关闭?在处理程序中 router.GET("/v1/get/*uri", func (c *gin.Context) { var url = c.Param("uri") if url[0:1] == "/" { url = url[1:] } req, err := http.NewRequest("GET", u

使用HTTP服务器。是否可以处理客户端套接字关闭?在处理程序中

 router.GET("/v1/get/*uri", func (c *gin.Context) {
     var url = c.Param("uri")
     if url[0:1] == "/" {
        url = url[1:]
     }
     req, err := http.NewRequest("GET", url, nil)

我向url发出HTTP客户端请求。若我从wget/curl客户端关闭到gin服务器的连接,gin-HTTP客户端请求仍在处理中。我想在客户端套接字断开连接事件上中断处理程序的执行,以避免浪费资源。

gin.Context.Done在客户端断开连接时返回。http.Transport.CancelRequest中断对url的http请求。所以http请求在goroutine中发出,我们等待select中的第一个事件:

http请求已完成

客户端已断开与gin服务器的连接

router.GET/v1/GET/*uri,func c*gin.Context{ var url=c.Paramuri 如果url[0:1]==/{ url=url[1:] }


这就是请求上下文的作用。将对http.NewRequest的调用替换为。从c.request.context获取上下文。有关文档,请参阅。
    tr := &http.Transport{ TLSClientConfig : (&tls.Config{ InsecureSkipVerify: true}),
                           DisableKeepAlives : false,
                           DisableCompression : false,
                           MaxIdleConns : 0,
                           MaxConnsPerHost : 0,
                           IdleConnTimeout : 0,
                           ResponseHeaderTimeout : 0,
                           ExpectContinueTimeout : 0,
                           ForceAttemptHTTP2 : true}
    client := http.Client{ Timeout: 20 * time.Second, Transport : tr}
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        fail(1, "NewRequest")
    }
    for k, v := range c.Request.Header {
        req.Header.Set(k, strings.Join(v, "\n"))
    }
    is_url_done := make(chan HTTPRequestResult, 1)
    go func() {
        resp, err := client.Do(req)
        is_url_done <- HTTPRequestResult{res, err}
    }()
    for {
    select {
    case <-c.Done():
        tr.CancelRequest(req)
        return
    case r:= <-is_url_done:
        if r.err != nil {
            c.String(http.StatusInternalServerError, "Error: %v\n", r.err)
        } else {
            var headers = map[string]string{}
            for key, values := range(r.res.Header) {
                headers[key] = strings.Join(values, ", ")
            }
            c.DataFromReader(r.res.StatusCode, r.res.ContentLength, "test", r.res.Body, headers)
        }

        return
    }
}