HTTP/2 cap dins del túnel SOCKS de Go
Clona el transport HTTP estàndard, selecciona el proxy SOCKS i inspecciona el protocol de destinació que realment s'ha negociat.
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.