Перейти 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)
Другие вопросы по тегам