Перейти http прокси с аутентификацией
Мне нужно использовать прокси с аутентификацией, используя метод 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)
, Прокси без аутентификации работает нормально, в этом примере. Кто-нибудь знает, могу ли я использовать прокси с аутентификацией в этом случае?
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
)
Вы можете создать клиента один раз, используя следующий код. Затем замените свой 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),
}
}
Спасибо всем!
Я нашел такое решение (может быть, оно кому-нибудь пригодится):
// 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)