Golang 中国
func proxy(w http.ResponseWriter, r *http.Request) {
    ok := proxyTO("http://127.0.0.1:9902", w, r)  //9902是关闭的,所以这里失败,r.Body close了
    if ok == false {
        proxy1("http://127.0.0.1:9903", w, r)   //然后请求9903 由于r.Body close了报错invalid Read on closed Body
    }
}

//这个是代理函数 写的不好 望高手指教
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)    //r.Body在这里请求失败时close了,有什么办法不close呢
    if err != nil {
        return false
    }
    if resp.StatusCode != http.StatusOK {
        w.WriteHeader(resp.StatusCode)
        return true              //在这里判断不是http.StatusOK返回合适吗
    }
    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
}

大概就是一个代理请求1失败后再请求2,但是body被close了。请问有什么解决方法?proxyTo有什么优化建议。求帮忙,感谢不尽!

0 回复
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。