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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器