gpt4 book ai didi

http - 关于http劫持和保活

转载 作者:IT王子 更新时间:2023-10-29 01:27:20 25 4
gpt4 key购买 nike

我用

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 更新 keepalive keepalive2keep-alive,它保持两个tcp连接,并且可以重复使用。

nokeepalive nokeepalive2但是当我劫持和 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com