HTTP/2 cabe dentro do túnel SOCKS do Go
Clone o transporte HTTP padrão, selecione o proxy SOCKS e inspecione o protocolo de destino realmente negociado.
Um túnel SOCKS transporta uma conexão TCP. O Go pode realizar TLS com o destino através desse túnel e negociar HTTP/2 ali; o servidor SOCKS não precisa falar HTTP/2 por si só.
Num programa que mantém o transporte padrão padrão do Go, clone a sua configuração e selecione 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 continuam a ser valores distintos. Selecione um endpoint SOCKS5 da lista de proxies SOCKS5 para o valor do proxy; o HTTP/2 continua a ser negociado com o destino. Use client para solicitar o URL real do serviço HTTPS e, em seguida, feche o corpo da resposta através do ciclo de vida normal da aplicação.
O transporte padrão suporta HTTP/2. Cloná-lo mantém essa configuração e permite alterar a escolha do proxy. A asserção de tipo assume que o programa não substituiu http.DefaultTransport por outro RoundTripper.
Para um transporte construído separadamente, reveja a sua configuração de HTTP/2, especialmente ao fornecer hooks dial ou TLS personalizados. O Go expõe ForceAttemptHTTP2 e, em versões mais recentes, uma configuração Protocols explícita para essas escolhas.
O destino ainda tem de oferecer HTTP/2 através de negociação TLS. Inspecione o valor Proto ou ProtoMajor da resposta bem-sucedida para ver o que foi usado. Um pedido HTTPS que tem sucesso através de SOCKS não prova por si só que o protocolo negociado era HTTP/2.