为什么Go中的http客户端在发出https请求时通过代理返回Unauthorized?

时间:2016-09-14 10:08:32

标签: http go https proxy

我一直在尝试通过代理向我一直在Go工作的客户提出GET请求。

卷曲等效物可能看起来像这样:

curl -v -x example.proxy.com:8080 -U username:password 'https://example.com'

虽然这样的东西会起作用,但Go中的等效物似乎没有,这是一个例子:

auth := "username:password"

basic := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))

proxyURL, _ := url.Parse("http://example.proxy.com:8080")
url, _ := url.Parse("https://example.com")

transport := &http.Transport{
    Proxy: http.ProxyURL(proxyURL),
}
client := &http.Client{
    Transport: transport,
}

request, _ := http.NewRequest("GET", url.String(), nil)
request.Header.Add("Proxy-Authorization", basic)
request.Header.Add("Proxy-Connection", "Keep-Alive")

response, _ := client.Do(request)

两者之间的唯一区别是curl命令在向http和https网址发出请求时都会成功,Go代码将在http上工作,但在上面的示例中(https://example.com或其他任何内容) https URL),这将返回Unauthorized状态。

我觉得我错过了一些非常明显的东西,但似乎无法深究它。

1 个答案:

答案 0 :(得分:1)

您正在发送到上游服务器而不是代理的http.Request上设置标头。您可以在代理*url.URL中设置基本身份验证:

proxyURL, _ := url.Parse("http://127.0.0.1:8080")
proxyURL.User = url.UserPassword("username", "password")

client := &http.Client{
    Transport: &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    },
}