为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
ITMISS 2022-07-04 10:40:15
https://github.com/gin-gonic/gin使用 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 客户端请求仍会被处理。我想中断客户端套接字断开事件上的处理程序执行,以免浪费资源。
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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

  1. http请求完成

  2. 客户端与 gin 服务器断开连接

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

  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

    }

}


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 279 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号