我用
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 连接不能重用(keep-alive),所以它很慢。
如何解决?
谢谢!抱歉我的英语不好。
12/9 更新 keep-alive,它保持两个tcp连接,并且可以重复使用。
但是当我劫持和 conn.Close() 时,它不能重用旧连接,所以它会在我每次刷新时创建一个新的 tcp 连接。
最佳答案
不要使用劫持,因为一旦劫持,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)
}
关于http - 关于http劫持和保活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20393147/