http - 关于http劫持和保活

标签 http go

我用

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 keepalive2 keep-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/

相关文章:

javascript - 如何在不更改外部页面的情况下在 iframe 中提交 html 表单?

java - 在主线程中等待 HTTP 请求

mysql - golang sql driver的prepare语句

http - Go lang 捕获带超时的重定向 url 和状态代码

go - vs 代码调试 go 测试未传递标志

c# - HTTP 可以用来跟踪连接吗?

java - 使用 HTTP 请求获取最后一个 JSON 数组元素

azure - 使用 Golang 从 Azure Blob 存储下载文件时得到 "curl Empty reply from server",但文件是在后台下载的

go - 可以使用很多匿名函数吗?

java - 使用 Java 类将文件上传到服务器