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}

Usa context, net/http y net/url; la aserción de tipo estándar supone que ese transporte sigue instalado. proxyURL se analiza, y observeConnect debe ser seguro ante concurrencia. Para las pruebas HTTPS públicas permitidas, Lista de proxies HTTP proporciona candidatos para esa URL de proxy.

La devolución de llamada se ejecuta antes de comprobar CONNECT para un 200 correcto, así que también puede observar 407. Nil continúa la comprobación normal y no acepta un túnel rechazado; un error hace fallar la petición.

X-Proxy-Region es un ejemplo definido por el proveedor. Lee aquí el estado y las cabeceras y deja la propiedad del cuerpo y del socket a Transport, que luego gestiona el TLS del destino.

Esto observa el establecimiento de un túnel nuevo, no cada petición. Una conexión reutilizada no tiene una respuesta CONNECT nueva, y la respuesta del sitio web tiene cabeceras separadas.

Artículos relacionados