Go http proxy with auth

旧时模样 提交于 2020-07-09 09:58:11

问题


I need to use a proxy with auth using PostForm method. If I use something like (simplified):

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

I can with ease do request.Header.Add("Proxy-Authorization", basicAuth) and it works fine. But now, I am editing third-party package, and I try to add proxy to the existing code:

    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)

It does not work, and it fails, to my mind, at string resp.Header.Add("Proxy-Authorization", basicAuth). Proxy without auth works fine, in this example. Does anybody know, can I use proxy with auth in this case?


回答1:


You are trying to add a header to a response, which isn't what you send to the server but what you receive. You have to add headers and data to the request, which you have to assemble first and then execute it like this:

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)

Then you just use the response (resp)




回答2:


Thanks to all!

I found such a solution (may be it would be useful to someone):

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



回答3:


You can create the client once by using the following code. Then substitute your HTTP client in the third-party package.

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

or you can parse the URL as well

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


来源:https://stackoverflow.com/questions/51175487/go-http-proxy-with-auth

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!