使用身份验证进行HTTP代理

时间:2018-07-04 13:59:16

标签: http authentication go proxy

我需要使用PostForm方法对auth使用代理。 如果我使用类似(简体)的内容:

request, err := http.NewRequest("GET", url.String(), nil)
response, err := client.Do(request)

我可以轻松进行{​​{1}},并且效果很好。 但是现在,我正在编辑第三方程序包,并尝试将代理添加到现有代码中:

request.Header.Add("Proxy-Authorization", basicAuth)

在我看来,它在字符串 proxyStr := "http://proxy.com:8080" proxyURL, _ := url.Parse(proxyStr) transport := &http.Transport{ Proxy: http.ProxyURL(proxyURL), } bot.Client = &http.Client{ Transport: transport, } resp, err := bot.Client.PostForm(method, params) auth := "username:password" basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth)) resp.Header.Add("Proxy-Authorization", basicAuth) 下不起作用,并且失败了。 在此示例中,没有身份验证的代理可以正常工作。 有人知道吗,在这种情况下我可以在auth中使用代理吗?

3 个答案:

答案 0 :(得分:3)

您正在尝试向响应中添加标头,这不是您发送到服务器的内容,而是您收到的内容。您必须向请求中添加标头和数据,您必须首先将其组装,然后再像这样执行它:

data := url.Values{} // the form data
data.Add("foo-key", "some data")
req, err := http.NewRequest("POST","https://yoururl", strings.NewReader(data.Encode()))
auth := "username:password"
basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
req.Header.Add("Proxy-Authorization", basicAuth)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
resp, err := bot.Client.Do(req)

然后,您只需使用响应(resp

答案 1 :(得分:2)

您可以使用以下代码创建一次客户端。然后将您的HTTP客户端替换为第三方程序包。

&http.Client{
  Transport: &http.Transport{
    Proxy: http.ProxyURL(&url.URL{
      Scheme: "http",
      User:   url.UserPassword("username", "password"),
      Host:   "146.137.9.45:65233",
    })
  }
}

或者您也可以解析URL

url, _ := url.Parse("http://username:password@146.137.9.45:65233")
&http.Client{
  Transport: &http.Transport{
    Proxy: http.ProxyURL(url),
  }
}

答案 2 :(得分:0)

谢谢大家!

我找到了这样的解决方案(可能对某人有用)

// Uncomment to use proxy with auth
    /*
    proxyStr := "http://proxy.com:3128"
    proxyURL, _ := url.Parse(proxyStr)
    auth := "username:password"
    basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
    hdr := http.Header{}
    hdr.Add("Proxy-Authorization", basicAuth)
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
        ProxyConnectHeader: hdr,
    }

    bot.Client = &http.Client{
        Transport: transport,
    }
    */

    resp, err := bot.Client.PostForm(method, params)