HTTP/2 får plats inne i Gos SOCKS-tunnel
Klona standard-HTTP-transporten, välj SOCKS-proxyn och granska destinationsprotokollet som faktiskt förhandlades.
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.