Перейти http прокси с аутентификацией - PullRequest
0 голосов
/ 04 июля 2018

Мне нужно использовать прокси с аутентификацией, используя метод 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 ]

0 голосов
/ 05 июля 2018

Спасибо всем!

Я нашел такое решение (может быть, оно кому-нибудь пригодится):

// 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)
0 голосов
/ 04 июля 2018

Вы пытаетесь добавить к ответу заголовок, который представляет собой не то, что вы отправляете на сервер, а то, что вы получаете. Вы должны добавить заголовки и данные к запросу, которые вы должны сначала собрать, а затем выполнить так:

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)

...