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.

Artigos relacionados