duanshan1977 2018-06-01 06:37
浏览 890
已采纳

强制关闭Golang中的http连接

My program downloads a file from one server and then returns it to the user. Here is snippet of it:

// Make get request to target server
resp, httpErr := http.Get(url.String()) 

// Return error if http request is failed 
if httpErr != nil {
    fmt.Fprintln(w,"Http Request Failed :" ,httpErr.Error())
    return
}

//Setting up headers
w.Header().Set("Content-Disposition", "attachment; filename="+vid.Title+"."+format.Extension)
w.Header().Set("Content-Type", r.Header.Get("Content-Type"))
w.Header().Set("Content-Length", strconv.Itoa(int(resp.ContentLength)))

// Copy instream of resp.Body to writer
io.Copy(w, resp.Body)

When the user stops the download or closes the connection I want to close the GET connection as well. But it does not get closed as I found via usage graph. How can I close the connection of the user?

  • 写回答

1条回答 默认 最新

  • doulangyu9636 2018-06-01 06:54
    关注

    You should close the Body of the request in any case:

    resp, httpErr := http.Get(url.String())
    if httpErr != nil {
       // handle error
       return
    }
    // if it's no error then defer the call for closing body
    defer resp.Body.Close()
    

    More should not be necessary to do. When the client closes the connection io.Copy returns with an error. io.Copy returns the number of bytes written and an error. You could check that, if you want to know if the copy succeded.

    written, err := io.Copy(w, resp.Body)
    if err != nil {
        // Copy did not succeed
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 iOS绕地区网络检测
  • ¥15 python验证码滑块图像识别
  • ¥15 根据背景及设计要求撰写设计报告
  • ¥15 QT6颜色选择对话框显示不完整
  • ¥20 能提供一下思路或者代码吗
  • ¥15 用twincat控制!
  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 单通道放大电路的工作原理
  • ¥30 YOLO检测微调结果p为1
  • ¥15 DS18B20内部ADC模数转换器