Arx*_*iss 2 environment-variables go
我在互联网上读到,Go 读取HTTP_PROXY环境变量并为默认客户端设置代理。但是,它对我不起作用,我不知道为什么。
我使用的是 Ubuntu 20.04,Go 是 1.16,所以我升级到 1.17 但它仍然一样。
我有下面的程序,并在终端中执行:HTTP_PROXY="http://localhost:8000" go run req.go
我看到首先Println打印出正确的值,但未使用代理。
func main() {
fmt.Println(os.Getenv("HTTP_PROXY"))
client := &http.Client{}
resp, err := client.Get("http://localhost:8090/vm/1")
if err != nil {
log.Fatal(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
}
Run Code Online (Sandbox Code Playgroud)
如果我修改代码并显式设置代理,它就可以工作。
u, err := url.Parse("http://localhost:8000")
if err != nil {
log.Fatal(err)
}
client := &http.Client{
Transport: &http.Transport{Proxy: http.ProxyURL(u)},
}
Run Code Online (Sandbox Code Playgroud)
在深入研究源代码后,我找到了主要原因和解决方法。这是评论行为,但相当深刻。源opensource.google/x/net/http/httpproxy/proxy.go 第 118 行和第 181 行正是if负责的。
问题是,HTTP_PROXY当请求的 URL 为localhost或127.xxx时,它会被忽略。但您可以轻松地将自定义 URI 添加到/etc/hosts或C:\Windows\System32\drivers\etc\hosts。
127.0.0.1 localserver.loc
Run Code Online (Sandbox Code Playgroud)
那么所有请求都必须转到localserver.loc:8090not localhost:8090。它会像魅力一样发挥作用。
| 归档时间: |
|
| 查看次数: |
4810 次 |
| 最近记录: |