【问题标题】:Go http proxy with auth使用 auth 访问 http 代理
【发布时间】:2018-12-13 00:03:12
【问题描述】:

我需要使用带有身份验证的代理,使用 PostForm 方法。 如果我使用类似(简化)的东西:

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

我可以轻松地做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)

在我看来,它不起作用,并且在字符串resp.Header.Add("Proxy-Authorization", basicAuth) 处失败。 在此示例中,没有身份验证的代理可以正常工作。 有谁知道,在这种情况下我可以使用代理和身份验证吗?

【问题讨论】:

  • 您将授权标头添加到响应中,而不是请求中。

标签: http authentication go proxy


【解决方案1】:

您可以使用以下代码创建一次客户端。然后在第三方包中替换您的 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】:

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

    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)

    【讨论】:

      【解决方案3】:

      谢谢大家!

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

      // 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-29
        相关资源
        最近更新 更多