HTTP/2 încape în tunelul SOCKS al Go
Clonați transportul HTTP standard, selectați proxy-ul SOCKS și inspectați protocolul destinației care a fost efectiv negociat.
Un tunel SOCKS transportă o conexiune TCP. Go poate efectua TLS cu destinația prin acel tunel și poate negocia HTTP/2 acolo; serverul SOCKS nu trebuie să vorbească el însuși HTTP/2.
Într-un program care păstrează transportul implicit standard al Go, clonați configurația acestuia și selectați proxy-ul:
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-ul și destinația rămân valori diferite. Selectați un punct final SOCKS5 din lista de proxy-uri SOCKS5 pentru valoarea proxy-ului; HTTP/2 este în continuare negociat cu destinația. Folosiți client pentru a solicita URL-ul real al serviciului HTTPS, apoi închideți corpul răspunsului prin ciclul de viață normal al aplicației.
Transportul implicit standard acceptă HTTP/2. Clonarea lui păstrează această configurație și permite schimbarea alegerii proxy-ului. Verificarea de tip presupune că programul nu a înlocuit http.DefaultTransport cu un alt RoundTripper.
Pentru un transport construit separat, revizuiți configurația sa HTTP/2, mai ales când furnizați cârlige dial sau TLS personalizate. Go expune ForceAttemptHTTP2 și, în versiunile mai noi, o configurație Protocols explicită pentru aceste alegeri.
Destinația trebuie să ofere în continuare HTTP/2 prin negociere TLS. Inspectați valoarea Proto sau ProtoMajor a răspunsului reușit pentru a vedea ce s-a folosit. O cerere HTTPS care reușește prin SOCKS nu dovedește prin ea însăși că protocolul negociat a fost HTTP/2.