golang:如何使用代理

时间:2017-03-08 03:20:20

标签: go https proxy

我可以在不设置代理的情况下执行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客户端请求?如何获得正确的结果?

1 个答案:

答案 0 :(得分:0)

您的Client.Transport.Proxy配置似乎没有任何问题。尝试使用的两种方法(ProxyURLProxyFromEnvironment)应该可以很好地指定forward proxy

相关问题:How to program Go to use a proxy?

需要注意的是,随后的客户端调用不会以某种方式绕过WriteProxy的使用而转而直接调用Write,但这不太可能,因为这将使代理规范失败。


鉴于此处提供的信息,“错误的请求”可能表明您正在访问代理,但它不能作为Client.Transport.Proxy指定的通用HTTP / HTTPS转发代理正常工作。

也许可以在这里添加一些清晰度:How to use Nginx as a HTTP/HTTPS proxy server?。总之,NGINX通常不用作转发代理,因此也许这不是您要尝试的。

如果您尝试将NGINX用作反向代理,则配置是服务器端的问题,您的客户端不需要特殊的代理配置-只需更改您的请求URL即可指向代理。


旁注:如果没有其他指定,&http.Client{}将使用DefaultTransport,它会自动包含ProxyFromEnvironment,因此仅当您构造非默认的Transport(就像在问题中所做的那样,以便指定InsecureSkipVerify),或者您想要具有特定于应用程序的代理配置。 而且,要重复一遍,仅在使用正向代理时才需要客户端代理配置。