HTTP/2 cabe dentro do túnel SOCKS de Go
Clona o transporte HTTP estándar, selecciona o proxy SOCKS e inspecciona o protocolo de destino que realmente se negociou.
Un túnel SOCKS transporta unha conexión TCP. Go pode realizar TLS co destino a través dese túnel e negociar HTTP/2 alí; o servidor SOCKS non precisa falar HTTP/2 por si mesmo.
Nun programa que conserva o transporte predeterminado estándar de Go, clona a súa configuración e selecciona o 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,
}
O proxy e o destino seguen sendo valores distintos. Selecciona un extremo SOCKS5 da lista de proxies SOCKS5 para o valor do proxy; HTTP/2 séguese negociando co destino. Usa client para solicitar a URL real do servizo HTTPS e despois pecha o corpo da resposta mediante o ciclo de vida normal da aplicación.
O transporte predeterminado estándar admite HTTP/2. Clonalo conserva esa configuración á vez que permite cambiar a elección de proxy. A aserción de tipo supón que o programa non substituíu http.DefaultTransport por outro RoundTripper.
Para un transporte construído por separado, revisa a súa configuración de HTTP/2, especialmente ao fornecer hooks de dial ou TLS personalizados. Go expón ForceAttemptHTTP2 e, en versións máis recentes, unha configuración explícita de Protocols para esas eleccións.
O destino aínda ten que ofrecer HTTP/2 mediante negociación TLS. Inspecciona o valor Proto ou ProtoMajor da resposta correcta para ver que se utilizou. Unha solicitude HTTPS que ten éxito a través de SOCKS non demostra por si soa que o protocolo negociado fose HTTP/2.