Kasya ang HTTP/2 sa loob ng SOCKS tunnel ng Go
I-clone ang karaniwang HTTP transport, piliin ang SOCKS proxy at siyasatin ang protocol ng destinasyon na aktuwal na naayos.
Ang SOCKS tunnel ay nagdadala ng isang TCP connection. Maaaring magsagawa ang Go ng TLS sa destinasyon sa pamamagitan ng tunnel na iyon at makipag-ayos ng HTTP/2 doon; hindi kailangang magsalita ng HTTP/2 ang SOCKS server mismo.
Sa isang programang nagpapanatili ng karaniwang default na transport ng Go, i-clone ang configuration nito at piliin ang 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,
}
Ang proxy at ang destinasyon ay nananatiling magkaibang halaga. Pumili ng SOCKS5 endpoint mula sa listahan ng SOCKS5 proxy para sa halaga ng proxy; ang HTTP/2 ay naayos pa rin sa destinasyon. Gamitin ang client para hilingin ang tunay na URL ng serbisyong HTTPS, pagkatapos ay isara ang katawan ng tugon sa karaniwang lifecycle ng application.
Sinusuportahan ng karaniwang default na transport ang HTTP/2. Ang pag-clone nito ay nagpapanatili ng configuration na iyon habang pinapayagan ang pagbabago ng pagpili ng proxy. Ipinapalagay ng type assertion na hindi pinalitan ng programa ang http.DefaultTransport ng ibang RoundTripper.
Para sa hiwalay na ginawang transport, suriin ang configuration ng HTTP/2 nito, lalo na kapag nagbibigay ng custom na dial o TLS hook. Inilalantad ng Go ang ForceAttemptHTTP2 at, sa mga bagong release, ang tahasang configuration ng Protocols para sa mga pagpipiliang iyon.
Kailangan pa ring mag-alok ng HTTP/2 ang destinasyon sa pamamagitan ng TLS negotiation. Siyasatin ang halaga ng Proto o ProtoMajor ng matagumpay na tugon para makita kung ano ang ginamit. Ang isang HTTPS request na nagtagumpay sa SOCKS ay hindi mismo nagpapatunay na ang naayos na protocol ay HTTP/2.