自定义 Go 的 HTTP transport 时保留 ProxyFromEnvironment
在自定义传输超时或连接池时保留 Go 的环境代理选择,而不是用零值 Proxy 字段替换默认值。
Go 的标准 DefaultTransport 将 Proxy 设为 ProxyFromEnvironment。单独构造的 &http.Transport{} 的 Proxy 函数为 nil,因此不会选择任何代理。
这种差异可能在仅为修改超时而添加传输之后出现。既然标准默认值仍然安装着,就克隆它并修改所需的字段:
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.ResponseHeaderTimeout = 15 * time.Second
client := &http.Client{
Transport: transport,
Timeout: 30 * time.Second,
}克隆会保留环境代理选择和其他默认传输设置。该类型断言假设应用程序没有用其他 RoundTripper 替换 DefaultTransport。
对于有意从零构建的传输,如果这就是它的路由策略,请显式设置 Proxy: http.ProxyFromEnvironment。显式的 ProxyURL 函数表达了另一种策略:一个选定的中间方。
在并发请求使用它之前配置好传输,然后在整个工作负载中复用它。修改共享的默认对象可能影响不相关的客户端。
自定义 TLS 设置是独立的。保留代理发现并不需要禁用证书校验,而且那会改变每个匹配的 HTTPS 请求的安全性。