首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略HTTP_PROXY环境变量

忽略HTTP_PROXY环境变量
EN

Stack Overflow用户
提问于 2021-10-31 19:32:19
回答 3查看 1.3K关注 0票数 2

我在互联网上到处阅读,它读取HTTP_PROXY环境变量,并为默认客户端设置代理。然而,这并不适合我,我也不知道为什么。

我在Ubuntu20.04上,Go是1.16,所以我升级到1.17,但还是一样。

下面有一个程序,在终端中执行:HTTP_PROXY="http://localhost:8000" go run req.go --我看到第一个Println打印出了正确的值,但是没有使用代理。

代码语言:javascript
复制
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))
}

如果我修改了代码,并显式地设置了代理,它就能工作。

代码语言:javascript
复制
u, err := url.Parse("http://localhost:8000")
if err != nil {
    log.Fatal(err)
}
client := &http.Client{
    Transport: &http.Transport{Proxy: http.ProxyURL(u)},
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-01 08:18:40

在深入挖掘源代码之后,我找到了主要原因,也找到了解决办法。这是评论的行为,但相当深刻。源opensource.google/x/net/http/httpproxy/proxy.go 118号线和on 第181行是负责的精确的if

问题是,当请求具有URL localhost127.x.x.x时,会忽略。但是您可以很容易地将自定义URI添加到/etc/hostsC:\Windows\System32\drivers\etc\hosts中。

代码语言:javascript
复制
127.0.0.1    localserver.loc

然后所有请求都必须转到localserver.loc:8090,而不是localhost:8090。它会像一种魅力一样运作。

票数 4
EN

Stack Overflow用户

发布于 2021-10-31 22:12:15

我假设您将NO_PROXY变量设置为"localhost",这是DefaultTransport所尊重的。

当使用http.ProxyURL()解释设置代理时,不管NO_PROXY如何,都会使用该代理。

票数 1
EN

Stack Overflow用户

发布于 2022-04-04 13:51:11

对于其他遇到这种情况的人,请确保没有使用空结构初始化传输。下面是DefaultTransport (注意Proxy值):

代码语言:javascript
复制
var DefaultTransport RoundTripper = &Transport{
    Proxy: ProxyFromEnvironment,
    DialContext: defaultTransportDialContext(&net.Dialer{
        Timeout:   30 * time.Second,
        KeepAlive: 30 * time.Second,
    }),
    ForceAttemptHTTP2:     true,
    MaxIdleConns:          100,
    IdleConnTimeout:       90 * time.Second,
    TLSHandshakeTimeout:   10 * time.Second,
    ExpectContinueTimeout: 1 * time.Second,
}

所以如果你要说的话:

代码语言:javascript
复制
if client.Transport == nil {
    client.Transport = &http.Transport{}
}

代理是不会被使用的。对我来说,解决办法是:

代码语言:javascript
复制
if client.Transport == nil {
    client.Transport = http.DefaultTransport.(*http.Transport).Clone()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69789948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档