代理请求主机被实际请求覆盖

时间:2017-11-13 11:18:38

标签: go proxy server

我正在尝试像这样服务代理:

package main

import (
    "net/http"
)

func main() {
    http.ListenAndServe(":8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        println(r.Host)
    }))
}

并使用curl调用它

curl -k -x http://localhost:8080 http://golang.org/

我打印出golang.org。为什么我没有获取代理主机名localhost?是http代理的错误或限制吗?

更新

为了澄清,我正在寻找的是像Nginx服务器地址http://nginx.org/en/docs/http/ngx_http_core_module.html#var_server_addr

1 个答案:

答案 0 :(得分:1)

我应该使用LocalAddrContextKey,但看起来有一个已知的错误,设置它https://github.com/golang/go/issues/18686 解决方法是劫持http.ResponseWriter ex:

package main

import (
    "net/http"
)

func main() {
    http.ListenAndServe(":8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        hij, ok := w.(http.Hijacker)
        if !ok {
            panic("http server does not support hijacker")
        }

        clientConn, _, err := hij.Hijack()
        if err != nil {
            panic(err.Error())
        }

        println(clientConn.LocalAddr().String())

    }))
}