关于http劫持和keep-alive

我用


resp, err := http.Get("http://example.com/")

得到一个 http.Response,我想准确地写入一个 http 处理程序,但只有 http.ResponseWriter,所以我劫持了它。


...

webConn, webBuf, err := hj.Hijack()

if err != nil {

    // handle error

}

defer webConn.Close()


// Write resp

resp.Write(webBuf)

...

写原始请求


但是当我劫持时,http 连接不能重用(保持活动),所以它很慢。


怎么解决?


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


update 12/9

http://img1.mukewang.com/60ebf34400017aba10000549.jpg

keep-alive,保持两个tcp连接,可以复用。

http://img4.mukewang.com/60ebf356000154ab10010514.jpg

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

慕桂英3389331
浏览 191回答 2
2回答

偶然的你

不要使用劫持,因为一旦劫持,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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go