登录
首页 >  Golang >  Go问答

不考虑 HTTP_PROXY 环境变量

来源:stackoverflow

时间:2024-03-28 17:39:28 433浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《不考虑 HTTP_PROXY 环境变量》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我在互联网上读到,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))
}

如果我修改代码并显式设置代理,它就可以工作。

u, err := url.Parse("http://localhost:8000")
if err != nil {
    log.Fatal(err)
}
client := &http.Client{
    Transport: &http.Transport{Proxy: http.ProxyURL(u)},
}

正确答案


深入研究源代码后,我找到了主要原因和解决方法。这是评论行为,但相当深刻。来源 opensource.google/x/net/http/httpproxy/proxy.go line 118line 181 正是负责的 if

问题是,当请求具有 url localhost127.x.x.x 时,http_proxy 会被忽略。但您可以轻松地将自定义 uri 添加到 /etc/hostsc:\windows\system32\drivers\etc\hosts

127.0.0.1    localserver.loc

然后所有请求都必须发送至 localserver.loc:8090 而不是 localhost:8090。它会像一个魅力一样工作。

我假设您将 no_proxy 变​​量设置为“localhost”,这是受 defaulttransport 尊重的。

当使用http.proxyurl()显式设置代理时,无论no_proxy如何,都会使用该代理。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>