Наблюдение за статусом CONNECT в Go внутри OnProxyConnectResponse
Установите перехватчик на транспорт до запросов; возврат nil сохраняет обычную проверку статуса туннеля.
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, а у ответа сайта отдельные заголовки.