我一直在尝试通过代理向我一直在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状态。
我觉得我错过了一些非常明显的东西,但似乎无法深究它。
答案 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),
},
}