HTTP/2 pas binne Go se SOCKS-tonnel
Kloon die standaard HTTP-vervoer, kies die SOCKS-volmag en ondersoek die bestemmingsprotokol wat werklik onderhandel is.
'n SOCKS-tonnel dra 'n TCP-verbinding. Go kan TLS met die bestemming deur daardie tonnel uitvoer en HTTP/2 daar onderhandel; die SOCKS-bediener hoef nie self HTTP/2 te praat nie.
In 'n program wat Go se standaardvervoer behou, kloon sy konfigurasie en kies die volmag:
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,
}
Die volmag en die bestemming bly verskillende waardes. Kies 'n SOCKS5-eindpunt uit die SOCKS5-volmaglys vir die volmagwaarde; HTTP/2 word steeds met die bestemming onderhandel. Gebruik client om die werklike HTTPS-diens-URL aan te vra en sluit dan die responsteliggaam deur die program se normale lewensiklus.
Die standaardvervoer ondersteun HTTP/2. Deur dit te kloon behou jy daardie konfigurasie terwyl die volmagkeuse kan verander. Die tipebewering veronderstel dat die program http.DefaultTransport nie met 'n ander RoundTripper vervang het nie.
Vir 'n afsonderlik geboude vervoer, hersien sy HTTP/2-konfigurasie, veral wanneer pasgemaakte dial- of TLS-hake verskaf word. Go stel ForceAttemptHTTP2 bloot en, in nuwer weergawes, eksplisiete Protocols-konfigurasie vir daardie keuses.
Die bestemming moet steeds HTTP/2 deur TLS-onderhandeling bied. Ondersoek die suksesvolle respons se Proto- of ProtoMajor-waarde om te sien wat gebruik is. 'n HTTPS-versoek wat deur SOCKS slaag, bewys op sigself nie dat die onderhandelde protokol HTTP/2 was nie.