我正在尝试像这样服务代理:
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
答案 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())
}))
}