Un túnel SOCKS transporta una conexión TCP. Go puede realizar TLS con el destino a través de ese túnel y negociar HTTP/2 allí; el servidor SOCKS no necesita hablar HTTP/2 por sí mismo.

En un programa que conserva el transporte predeterminado estándar de Go, clona su configuración y selecciona el proxy:

import (
    "net/http"
    "net/url"
    "time"
)

proxyURL := &url.URL{
    Scheme: "socks5",
    Host: "proxy.example:1080",
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
client := &http.Client{
    Transport: transport,
    Timeout: 30 * time.Second,
}

El proxy y el destino siguen siendo valores distintos. Selecciona un extremo SOCKS5 de la lista de proxies SOCKS5 para el valor del proxy; HTTP/2 se sigue negociando con el destino. Usa client para solicitar la URL real del servicio HTTPS y luego cierra el cuerpo de la respuesta mediante el ciclo de vida normal de la aplicación.

El transporte predeterminado estándar admite HTTP/2. Clonarlo conserva esa configuración y a la vez permite cambiar la elección de proxy. La aserción de tipo supone que el programa no ha sustituido http.DefaultTransport por otro RoundTripper.

Para un transporte construido por separado, revisa su configuración de HTTP/2, especialmente al proporcionar hooks de dial o TLS personalizados. Go expone ForceAttemptHTTP2 y, en versiones más recientes, una configuración explícita de Protocols para esas elecciones.

El destino todavía tiene que ofrecer HTTP/2 mediante negociación TLS. Inspecciona el valor Proto o ProtoMajor de la respuesta correcta para ver qué se utilizó. Una solicitud HTTPS que tiene éxito a través de SOCKS no demuestra por sí sola que el protocolo negociado fuera HTTP/2.

Artículos relacionados