HTTP/2 passer indeni Go's SOCKS-tunnel
Klon standardtransporten for HTTP, vælg SOCKS-proxyen, og undersøg den destinationsprotokol, der faktisk blev forhandlet.
En SOCKS-tunnel bærer en TCP-forbindelse. Go kan udføre TLS med destinationen gennem den tunnel og forhandle HTTP/2 der; SOCKS-serveren behøver ikke selv at tale HTTP/2.
I et program, der beholder Gos standardtransport, klones dens konfiguration, og proxyen vælges:
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,
}
Proxyen og destinationen forbliver forskellige værdier. Vælg et SOCKS5-endepunkt fra SOCKS5-proxylisten til proxyværdien; HTTP/2 forhandles stadig med destinationen. Brug client til at anmode om den rigtige HTTPS-tjeneste-URL, og luk derefter svarlegemet gennem applikationens normale livscyklus.
Standardtransporten understøtter HTTP/2. Kloning bevarer den konfiguration og tillader samtidig, at proxyvalget ændres. Typeerklæringen forudsætter, at programmet ikke har erstattet http.DefaultTransport med en anden RoundTripper.
For en særskilt opbygget transport bør du gennemgå dens HTTP/2-konfiguration, især når der leveres brugerdefinerede dial- eller TLS-hooks. Go eksponerer ForceAttemptHTTP2 og i nyere udgivelser eksplicit Protocols-konfiguration til disse valg.
Destinationen skal stadig tilbyde HTTP/2 gennem TLS-forhandling. Undersøg det vellykkede svars Proto- eller ProtoMajor-værdi for at se, hvad der blev brugt. En HTTPS-anmodning, der lykkes gennem SOCKS, beviser ikke i sig selv, at den forhandlede protokol var HTTP/2.