dongtidai6519 2018-02-01 13:09
浏览 340

如何保持http.Request.Body在Transport.RoundTrip中不关闭?

I build a proxy,when proxy to 127.0.0.1:9902 fail,then proxy to 127.0.0.1:9903.

But, when proxy to 127.0.0.1:9902 fail,the http request body be closed in Transport.RoundTrip,so proxy to 127.0.0.1:9903 will be error(invalid Read on closed Body).

I have been plagued for a long time.any master can help me and give an idea to proxyTo function by the way? thank you very much!

func proxy(w http.ResponseWriter, r *http.Request) {
    ok := proxyTO("http://127.0.0.1:9902", w, r)  //server127.0.0.1:9902 not open,so r.Body close after proxyTo
    if ok == false {
        proxy1("http://127.0.0.1:9903", w, r)   //error http: invalid Read on closed Body
    }
}

//any idea on proxyTo function?
func proxyTo(addr string, w http.ResponseWriter, r *http.Request) bool {
    urlLs, _ := url.Parse(addr)
    r.URL.Host = urlLs.Host
    r.URL.Scheme = urlLs.Scheme
    r.Host = urlLs.Host
    r.RequestURI = ""

    resp, err := http.DefaultTransport.RoundTrip(r)    //how to keep r.Body not close when error
    if err != nil {
        return false
    }
    if resp.StatusCode != http.StatusOK {
        w.WriteHeader(resp.StatusCode)
        return true              //here return is ok? 
    }
    for name, vals := range resp.Header {
        for _, val := range vals {
            w.Header().Add(name, val)
        }
    }
    io.Copy(w, resp.Body)

    resp.Body.Close()
    return true
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥35 平滑拟合曲线该如何生成
    • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
    • ¥15 名为“Product”的列已属于此 DataTable
    • ¥15 安卓adb backup备份应用数据失败
    • ¥15 eclipse运行项目时遇到的问题
    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 自己瞎改改,结果现在又运行不了了
    • ¥15 链式存储应该如何解决
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站