我在互联网上到处阅读,它读取HTTP_PROXY环境变量,并为默认客户端设置代理。然而,这并不适合我,我也不知道为什么。
我在Ubuntu20.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)},
}发布于 2021-11-01 08:18:40
在深入挖掘源代码之后,我找到了主要原因,也找到了解决办法。这是评论的行为,但相当深刻。源opensource.google/x/net/http/httpproxy/proxy.go 118号线和on 第181行是负责的精确的if。
问题是,当请求具有URL localhost或127.x.x.x时,会忽略。但是您可以很容易地将自定义URI添加到/etc/hosts或C:\Windows\System32\drivers\etc\hosts中。
127.0.0.1 localserver.loc然后所有请求都必须转到localserver.loc:8090,而不是localhost:8090。它会像一种魅力一样运作。
发布于 2021-10-31 22:12:15
我假设您将NO_PROXY变量设置为"localhost",这是DefaultTransport所尊重的。
当使用http.ProxyURL()解释设置代理时,不管NO_PROXY如何,都会使用该代理。
发布于 2022-04-04 13:51:11
对于其他遇到这种情况的人,请确保没有使用空结构初始化传输。下面是DefaultTransport (注意Proxy值):
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,
}所以如果你要说的话:
if client.Transport == nil {
client.Transport = &http.Transport{}
}代理是不会被使用的。对我来说,解决办法是:
if client.Transport == nil {
client.Transport = http.DefaultTransport.(*http.Transport).Clone()
}https://stackoverflow.com/questions/69789948
复制相似问题