第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以在 Gin 服務(wù)器中處理客戶端套接字事件關(guān)閉(基于 net/http 包)?

是否可以在 Gin 服務(wù)器中處理客戶端套接字事件關(guān)閉(基于 net/http 包)?

Go
ITMISS 2022-07-04 10:40:15
https://github.com/gin-gonic/gin使用 HTTP 服務(wù)器。是否可以處理客戶端套接字關(guān)閉?在處理程序中 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 發(fā)出 HTTP 客戶端請求。如果我從我的 wget/curl 客戶端關(guān)閉與 gin 服務(wù)器的連接,gin HTTP 客戶端請求仍會被處理。我想中斷客戶端套接字?jǐn)嚅_事件上的處理程序執(zhí)行,以免浪費(fèi)資源。
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個贊

如果客戶端斷開連接,則 gin.Context.Done() 返回。http.Transport.CancelRequest() 中斷對 url 的 http 請求。所以 http 請求是在 goroutine 中發(fā)出的,我們等待 select 中的第一個事件:

  1. http請求完成

  2. 客戶端與 gin 服務(wù)器斷開連接

    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

    }

}


查看完整回答
反對 回復(fù) 2022-07-04
  • 1 回答
  • 0 關(guān)注
  • 275 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號