Un tunnel SOCKS trasporta una connessione TCP. Go può eseguire TLS con la destinazione attraverso quel tunnel e negoziare HTTP/2 lì; il server SOCKS non deve parlare HTTP/2 esso stesso.

In un programma che mantiene il trasporto predefinito standard di Go, clona la sua configurazione e seleziona il 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,
}

Il proxy e la destinazione restano valori distinti. Seleziona un endpoint SOCKS5 dall'elenco dei proxy SOCKS5 per il valore del proxy; HTTP/2 viene comunque negoziato con la destinazione. Usa client per richiedere l'URL reale del servizio HTTPS, poi chiudi il corpo della risposta tramite il normale ciclo di vita dell'applicazione.

Il trasporto predefinito standard supporta HTTP/2. Clonarlo conserva questa configurazione pur consentendo di cambiare la scelta del proxy. L'asserzione di tipo presuppone che il programma non abbia sostituito http.DefaultTransport con un altro RoundTripper.

Per un trasporto costruito separatamente, esamina la sua configurazione HTTP/2, soprattutto quando fornisci hook dial o TLS personalizzati. Go espone ForceAttemptHTTP2 e, nelle versioni più recenti, una configurazione Protocols esplicita per queste scelte.

La destinazione deve comunque offrire HTTP/2 tramite negoziazione TLS. Ispeziona il valore Proto o ProtoMajor della risposta riuscita per vedere cosa è stato usato. Una richiesta HTTPS che riesce tramite SOCKS non dimostra di per sé che il protocollo negoziato fosse HTTP/2.

Articoli correlati