为了账号安全,请及时绑定邮箱和手机立即绑定

关于http劫持和keep-alive

关于http劫持和keep-alive

Go
慕桂英3389331 2021-06-28 13:11:46
我用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 respresp.Write(webBuf)...写原始请求但是当我劫持时,http 连接不能重用(保持活动),所以它很慢。怎么解决?谢谢!对不起,我的游泳池英语。update 12/9keep-alive,保持两个tcp连接,可以复用。但是当我劫持和 conn.Close() 时,它不能重用旧连接,因此每次刷新时它都会创建一个新的 tcp 连接。
查看完整描述

2 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

不要使用劫持,因为一旦劫持,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)

}


查看完整回答
反对 回复 2021-07-12
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信