Спостерігайте за статусом 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, а відповідь сайту має окремі заголовки.