HTTP/2 past in Go's SOCKS-tunnel
Kloon het standaard HTTP-transport, selecteer de SOCKS-proxy en inspecteer het bestemmingsprotocol dat daadwerkelijk is onderhandeld.
Een SOCKS-tunnel vervoert één TCP-verbinding. Go kan via die tunnel TLS met de bestemming doen en daar HTTP/2 onderhandelen; de SOCKS-server hoeft zelf geen HTTP/2 te spreken.
Kloon in een programma dat het standaardtransport van Go behoudt de configuratie en selecteer de 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,
}
De proxy en de bestemming blijven verschillende waarden. Selecteer een SOCKS5-eindpunt uit de SOCKS5-proxylijst voor de proxywaarde; HTTP/2 wordt nog steeds met de bestemming onderhandeld. Gebruik client om de echte HTTPS-service-URL op te vragen en sluit daarna de responsbody via de normale levenscyclus van de applicatie.
Het standaardtransport ondersteunt HTTP/2. Door het te klonen blijft die configuratie behouden terwijl de proxykeuze kan veranderen. De type-assertie gaat ervan uit dat het programma http.DefaultTransport niet door een andere RoundTripper heeft vervangen.
Bekijk voor een apart gebouwd transport de HTTP/2-configuratie, vooral bij het leveren van aangepaste dial- of TLS-hooks. Go stelt ForceAttemptHTTP2 beschikbaar en, in nieuwere releases, expliciete Protocols-configuratie voor die keuzes.
De bestemming moet nog steeds HTTP/2 bieden via TLS-onderhandeling. Inspecteer de Proto- of ProtoMajor-waarde van de geslaagde respons om te zien wat is gebruikt. Een HTTPS-verzoek dat via SOCKS slaagt, bewijst op zichzelf niet dat het onderhandelde protocol HTTP/2 was.