关于http劫持和保持活力

Spe*_*ode 5 http go

我用

resp, err := http.Get("http://example.com/")
Run Code Online (Sandbox Code Playgroud)

得到一个http.Response,我想要写一个http处理程序,但只有http.ResponseWriter,所以我劫持它.

...
webConn, webBuf, err := hj.Hijack()
if err != nil {
    // handle error
}
defer webConn.Close()

// Write resp
resp.Write(webBuf)
...
Run Code Online (Sandbox Code Playgroud)

写原始请求

但是当我劫持时,http连接无法重用(keep-alive),所以它很慢.

怎么解决?

谢谢!对不起我的游泳池英语.

更新12/9 活着 keepalive2 keep-alive,它保持两个tcp连接,并且可以重用.

nokeepalive nokeepalive2 但是当我劫持和conn.Close()时,它无法重用旧连接,因此每次刷新时都会创建一个新的tcp连接.

Spe*_*ode 5

不要使用劫持,因为一旦劫持,HTTP服务器库就不会对连接做任何其他事情,所以无法重用.

我改变方式,复制Header和Body,看起来像反向代理(http://golang.org/src/pkg/net/http/httputil/reverseproxy.go),是有效的.

例:

func copyHeader(dst, src http.Header) {
    for k, w := range src {
        for _, v := range w {
            dst.Add(k, v)
        }
    }
}

func copyResponse(r *http.Response, w http.ResponseWriter) {
    copyHeader(w.Header(), r.Header)
    w.WriteHeader(r.StatusCode)
    io.Copy(w, r.Body)
}

func handler(w http.ResponseWriter, r *http.Response) {
    resp, err := http.Get("http://www.example.com")
    if err != nil {
        // handle error
    }
    copyResponse(resp, w)
}
Run Code Online (Sandbox Code Playgroud)