En SOCKS-tunnel transporterar en TCP-anslutning. Go kan göra TLS med destinationen genom den tunneln och förhandla HTTP/2 där; SOCKS-servern behöver inte själv tala HTTP/2.

I ett program som behåller Gos standardtransport, klona dess konfiguration och välj proxyn:

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,
}

Proxyn och destinationen förblir olika värden. Välj en SOCKS5-slutpunkt från SOCKS5-proxylistan för proxyvärdet; HTTP/2 förhandlas fortfarande med destinationen. Använd client för att begära den riktiga HTTPS-tjänstens URL och stäng sedan svarskroppen genom applikationens normala livscykel.

Standardtransporten stöder HTTP/2. Kloning behåller den konfigurationen och låter proxyvalet ändras. Typkontrollen förutsätter att programmet inte har ersatt http.DefaultTransport med en annan RoundTripper.

För en separat byggd transport, granska dess HTTP/2-konfiguration, särskilt när du tillhandahåller anpassade dial- eller TLS-krokar. Go exponerar ForceAttemptHTTP2 och, i nyare utgåvor, explicit Protocols-konfiguration för dessa val.

Destinationen måste fortfarande erbjuda HTTP/2 genom TLS-förhandling. Granska Proto- eller ProtoMajor-värdet i det lyckade svaret för att se vad som användes. En HTTPS-begäran som lyckas genom SOCKS bevisar inte i sig att det förhandlade protokollet var HTTP/2.

Relaterade artiklar