Observe o status CONNECT do Go em OnProxyConnectResponse
Instale o hook no transport antes das requisições; retornar nil preserva a verificação normal do status do túnel.
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}Use context, net/http e net/url; a asserção de tipo padrão pressupõe que esse transport permaneça instalado. proxyURL é analisado, e observeConnect precisa ser seguro quanto à concorrência. Para sondagens HTTPS públicas permitidas, Lista de proxies HTTP fornece candidatos para essa URL de proxy.
O callback executa antes da verificação de CONNECT para um 200 bem-sucedido, então também pode observar 407. Nil continua a verificação normal e não aceita um túnel rejeitado; um erro faz a requisição falhar.
X-Proxy-Region é um exemplo definido pelo provedor. Leia status e cabeçalhos aqui e deixe a posse do corpo e do socket com o Transport, que então cuida do TLS de destino.
Isto observa a criação de um novo túnel, não cada requisição. Uma conexão reutilizada não tem nova resposta CONNECT, e a resposta do site tem cabeçalhos separados.