我可以在不设置代理的情况下执行http或https客户端请求。
enter code here
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{}
client.Transport = tr
request, err := http.NewRequest("HEAD", "http://www.???.com", nil)
request.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36")
resp, err := client.Do(request)
if err != nil {
log.Fatalln(err)
return
}
defer resp.Body.Close()
httpcode = resp.Status
这个脚本正常工作,当我请求https网址时,返回200 ok状态码,但如果我设置代理,脚本就会出问题:
proxyString := "https://47.91.179.xxx:443"
proxyUrl, _ := url.Parse(proxyString)
tr := &http.Transport{
Proxy: http.ProxyURL(proxyUrl),
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{}
client.Transport = tr
....................
我总是得到“Bad request”错误,我阅读了文档:https://golang.org/pkg/net/http/:
........... 从Go 1.6开始,当使用HTTPS时,http包对HTTP/2协议有透明支持。必须禁用HTTP/2的程序可以通过将Transport.TLSNextProto(用于客户端)或Server.TLSNextProto(用于服务器)设置为非nil、空映射来实现。另外,目前支持以下GODEBUG环境变量: ..............
因此,我试图停止http2:
tr := &http.Transport{
Proxy: http.ProxyURL(proxyUrl),
//Proxy: http.ProxyFromEnvironment,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper),
}
出现了相同的问题,"Bad request"。我尝试了 os.Setenv("HTTPS_PROXY", "47.91.???.???:443"),但结果还是一样。 这个问题被记录在服务器上:
{S;}220.255.95.68{S;}-{S;}07/Mar/2017:17:01:47 +0800{S;}CONNECT www.panpacific.com:443 HTTP/1.1{S;}400{S;}173{S;}340{S;}-{S;}-{S;}-{S;}-{S;}-{S;}www.panpacific.com
所以,Golang是否支持通过代理进行https客户端请求?我如何获得正确的结果?