Http 反向代理零指针
我正试图在golang中编写一个反向代理,以重用该代理,但我得到了一个nil指针,原因我看不出来Http 反向代理零指针,http,go,reverse-proxy,Http,Go,Reverse Proxy,我正试图在golang中编写一个反向代理,以重用该代理,但我得到了一个nil指针,原因我看不出来 type Configuration struct { Proxies map[string]Proxy `mapstructure:"proxies"` Port int `mapstructure:"port"` } type Proxy struct { Upstream string `mapstr
type Configuration struct {
Proxies map[string]Proxy `mapstructure:"proxies"`
Port int `mapstructure:"port"`
}
type Proxy struct {
Upstream string `mapstructure:"upstream"`
SkipVerify bool `mapstructure:"tls-skip-verify"`
HostProxy *httputil.ReverseProxy
}
这些是我正在加载的结构。然后我遍历映射,在代理结构中创建ReverseProxy对象并启动服务
for host, proxy := range config.Proxies {
log.Printf("Loading proxies for: %s", host)
log.Printf("Upstream: %s", proxy.Upstream)
log.Printf("SkipVerify: %t", proxy.SkipVerify)
remoteURL, err := url.Parse(proxy.Upstream)
if err != nil {
log.Fatalf("Unable to parse target: %v", err)
}
log.Infof("Remote : %v", remoteURL)
proxy.HostProxy = httputil.NewSingleHostReverseProxy(remoteURL)
proxy.HostProxy.Transport = &http.Transport{
Proxy: http.ProxyFromEnvironment,
Dial: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 15 * time.Second,
}).Dial,
TLSHandshakeTimeout: 10 * time.Second,
TLSClientConfig: &tls.Config{InsecureSkipVerify: proxy.SkipVerify},
}
log.Print(proxy.HostProxy.Transport)
}
log.Info("Starting Up on Port", config.Port)
http.Handle("/", &config)
log.Fatal(http.ListenAndServe(":"+strconv.Itoa(config.Port), &config))
当它被调用时,我会这样处理:
func (config *Configuration) ServeHTTP(w http.ResponseWriter, r *http.Request) {
host := r.Host
r.Host = r.URL.Host
log.Info(config)
if proxy, ok := config.Proxies[host]; ok {
log.Infof("Processing request for %s", host)
log.Printf("Upstream: %s", proxy.Upstream)
log.Printf("SkipVerify: %t", proxy.SkipVerify)
log.Print(proxy.HostProxy.Transport)
proxy.HostProxy.ServeHTTP(w, r)
} else {
w.Write([]byte("403: Host forbidden " + host))
}
}
但是它抛出proxy.HostProxy对象为nil的异常。所有其他数据都会保留并正确记录。例如proxy.Upstream和proxy.SkipVerify 请用stacktrace及其指向的代码更新您的问题。。。。无论如何,
代理
是一个值的映射,而不是指针,当您在这样一个映射上进行范围调整时,您在每次迭代中得到的是映射中值的副本,在循环中修改副本不会修改映射中的原始值。将其更改为代理映射[字符串]*Proxy。或者,在初始化proxy.hosporxy
之后,应该将proxy
迭代变量设置到映射中,覆盖原始变量,即config.proxy[host]=proxy
。。。。下面是上述评论的一个例子:D'oh。你说得对,就是这样。非常感谢。