【发布时间】:2017-07-28 11:48:10
【问题描述】:
我可以在不设置代理的情况下执行 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 url 时得到 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
....................
我总是收到“错误请求”,我阅读了文档:https://golang.org/pkg/net/http/:
............ 从 Go 1.6 开始,http 包在使用 HTTPS 时对 HTTP/2 协议具有透明支持。必须禁用 HTTP/2 的程序可以通过将 Transport.TLSNextProto(用于客户端)或 Server.TLSNextProto(用于服务器)设置为非零的空映射来实现。或者,当前支持以下 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),
}
同样的问题,“错误请求”。我试过 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 客户端请求?如何获得正确的结果?
【问题讨论】:
-
我针对我的代理服务器测试了您的代码,它运行良好。这可能是您的代理的配置问题。您是否尝试过使用带有此代理的普通网络浏览器?
-
嗨,IanB 你的代理服务器是什么?我使用 nginx(反向代理)。你是否使用 [TLSNextProto] 来停止 http2?
-
我使用 Squid 代理。不,我没有指定 TLSNextProto。反向代理不应要求客户端使用任何特殊代理配置,即它应该是透明的
-
标题重复:How to program Go to use a proxy?,但不是同一个问题。
-
我很确定问题出在代理 URL 上。具体来说,代理必须使用 HTTP 协议访问,并且您指定 HTTPS。