ENV
golang 1.17
使用代理
需要在创建 http client 的时候设置,使 http 库能够捕获环境变量
func newClient(cert tls.Certificate) (*http.Client, error) {
config := &tls.Config{
Certificates: []tls.Certificate{cert},
}
config.BuildNameToCertificate()
transport := &http.Transport{
Proxy: http.ProxyFromEnvironment,
TLSClientConfig: config,
IdleConnTimeout: 90 * time.Second,
}
if err := http2.ConfigureTransport(transport); err != nil {
return nil, err
}
return &http.Client{
Transport: transport,
Timeout: 20 * time.Second,
}, nil
}
不使用代理
NO_PROXY
环境变量
// A nil URL and nil error are returned if no proxy is defined in the
// environment, or a proxy should not be used for the given request,
// as defined by NO_PROXY.
localhost
127.0.0.1
默认也不使用代理
// As a special case, if req.URL.Host is "localhost" (with or without
// a port number), then a nil URL and nil error will be returned.
- 使用代码禁用代理环境变量
创建 client 时,可以使用自定义 transport
transport := http.DefaultTransport
transport.(*http.Transport).Proxy = nil
client := &http.Client{
Transport: transport,
}
golang源码出处
https://cs.opensource.google/go/go/+/refs/tags/go1.17:src/net/http/transport.go;l=40
// DefaultTransport is the default implementation of Transport and is
// used by DefaultClient. It establishes network connections as needed
// and caches them for reuse by subsequent calls. It uses HTTP proxies
// as directed by the $HTTP_PROXY and $NO_PROXY (or $http_proxy and
// $no_proxy) environment variables.
...
// ProxyFromEnvironment returns the URL of the proxy to use for a
// given request, as indicated by the environment variables
// HTTP_PROXY, HTTPS_PROXY and NO_PROXY (or the lowercase versions
// thereof). HTTPS_PROXY takes precedence over HTTP_PROXY for https
// requests.
//
// The environment values may be either a complete URL or a
// "host[:port]", in which case the "http" scheme is assumed.
// The schemes "http", "https", and "socks5" are supported.
// An error is returned if the value is a different form.
//
// A nil URL and nil error are returned if no proxy is defined in the
// environment, or a proxy should not be used for the given request,
// as defined by NO_PROXY.
//
// As a special case, if req.URL.Host is "localhost" (with or without
// a port number), then a nil URL and nil error will be returned.
func ProxyFromEnvironment(req *Request) (*url.URL, error) {
return envProxyFunc()(req.URL)
}