transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
transport.OnProxyConnectResponse = func(
    _ context.Context,
    _ *url.URL,
    _ *http.Request,
    response *http.Response,
) error {
    observeConnect(response.StatusCode, response.Header.Get("X-Proxy-Region"))
    return nil
}
client := &http.Client{Transport: transport}

Используйте context, net/http и net/url; стандартное утверждение типа предполагает, что этот транспорт остаётся установленным. proxyURL разбирается, а observeConnect должен быть безопасен при конкурентном доступе. Для разрешённых публичных HTTPS-проверок Список HTTP-прокси предоставляет кандидатов для этого proxy URL.

Обратный вызов выполняется до проверки CONNECT на успешный 200, поэтому он может наблюдать и 407. Nil продолжает обычную проверку и не принимает отклонённый туннель; ошибка приводит к сбою запроса.

X-Proxy-Region — пример, определяемый провайдером. Читайте здесь статус и заголовки, а владение телом и сокетом оставьте Transport, который затем обрабатывает TLS пункта назначения.

Это наблюдает за установкой нового туннеля, а не за каждым запросом. У повторно используемого соединения нет нового ответа CONNECT, а у ответа сайта отдельные заголовки.

Похожие статьи