我用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)
}
- 2 回答
- 0 关注
- 190 浏览
添加回答
举报
0/150
提交
取消