Un túnel SOCKS transporta una connexió TCP. Go pot fer TLS amb la destinació a través d'aquest túnel i negociar-hi HTTP/2; el servidor SOCKS no ha de parlar HTTP/2 ell mateix.

En un programa que conserva el transport estàndard per defecte de Go, clona'n la configuració i 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 i la destinació continuen sent valors diferents. Selecciona un punt final SOCKS5 de la llista de proxies SOCKS5 per al valor del proxy; HTTP/2 encara es negocia amb la destinació. Fes servir client per sol·licitar l'URL real del servei HTTPS i després tanca el cos de la resposta mitjançant el cicle de vida normal de l'aplicació.

El transport estàndard per defecte admet HTTP/2. Clonar-lo conserva aquesta configuració alhora que permet canviar l'elecció de proxy. L'asserció de tipus assumeix que el programa no ha substituït http.DefaultTransport per un altre RoundTripper.

Per a un transport construït a part, revisa'n la configuració d'HTTP/2, sobretot quan proporcionis hooks de dial o TLS personalitzats. Go exposa ForceAttemptHTTP2 i, en versions més noves, una configuració explícita de Protocols per a aquestes eleccions.

La destinació encara ha d'oferir HTTP/2 mitjançant la negociació TLS. Inspecciona el valor Proto o ProtoMajor de la resposta correcta per veure què s'ha utilitzat. Una sol·licitud HTTPS que té èxit a través de SOCKS no demostra per si mateixa que el protocol negociat fos HTTP/2.

Articles relacionats