HTTP/2 funguje uvnitř SOCKS tunelu v Go
Naklonujte standardní HTTP transport, vyberte SOCKS proxy a prozkoumejte protokol cíle, který byl skutečně vyjednán.
SOCKS tunel přenáší jedno TCP spojení. Go může přes tento tunel provést TLS s cílem a vyjednat tam HTTP/2; samotný SOCKS server nemusí HTTP/2 rozumět.
V programu, který si zachovává standardní výchozí transport Go, naklonujte jeho konfiguraci a vyberte 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,
}
Proxy a cíl zůstávají odlišnými hodnotami. Pro hodnotu proxy vyberte koncový bod SOCKS5 ze seznamu SOCKS5 proxy; HTTP/2 se stále vyjednává s cílem. Pomocí client vyžádejte skutečnou URL služby HTTPS a poté uzavřete tělo odpovědi obvyklým životním cyklem aplikace.
Standardní výchozí transport podporuje HTTP/2. Jeho klonování zachová tuto konfiguraci a zároveň umožní změnit volbu proxy. Tvrzení o typu předpokládá, že program nenahradil http.DefaultTransport jiným RoundTripperem.
U samostatně sestaveného transportu zkontrolujte jeho konfiguraci HTTP/2, zejména když zadáváte vlastní háky dial nebo TLS. Go vystavuje ForceAttemptHTTP2 a v novějších verzích explicitní konfiguraci Protocols pro tyto volby.
Cíl stále musí nabízet HTTP/2 prostřednictvím vyjednávání TLS. Prohlédněte hodnotu Proto nebo ProtoMajor úspěšné odpovědi, abyste zjistili, co bylo použito. Úspěšný požadavek HTTPS přes SOCKS sám o sobě nedokazuje, že vyjednaným protokolem bylo HTTP/2.