Az HTTP/2 elfér a Go SOCKS-alagútjában
Klonozza a szabványos HTTP-szállítót, válassza ki a SOCKS-proxyt, és vizsgálja meg a ténylegesen egyeztetett célprotokollt.
Egy SOCKS-alagút TCP-kapcsolatot továbbít. A Go azon az alagúton keresztül TLS-t folytathat a céllal, és ott HTTP/2-t egyeztethet; magának a SOCKS-kiszolgálónak nem kell HTTP/2-t beszélnie.
Egy olyan programban, amely megtartja a Go szabványos alapértelmezett szállítóját, klónozza annak konfigurációját, és válassza ki a proxyt:
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,
}
A proxy és a cél továbbra is különböző értékek. A proxy értékéhez válasszon SOCKS5-végpontot a SOCKS5-proxylistáról; a HTTP/2 továbbra is a céllal kerül egyeztetésre. A client használatával kérje le a valódi HTTPS-szolgáltatás URL-jét, majd zárja le a válasz törzsét az alkalmazás szokásos életciklusa szerint.
A szabványos alapértelmezett szállító támogatja a HTTP/2-t. A klónozás megőrzi ezt a konfigurációt, miközben lehetővé teszi a proxy kiválasztásának megváltoztatását. A típusellenőrzés feltételezi, hogy a program nem cserélte le a http.DefaultTransportot egy másik RoundTripperre.
Egy külön felépített szállító esetében tekintse át annak HTTP/2-konfigurációját, különösen egyéni dial- vagy TLS-horgok megadásakor. A Go közzéteszi a ForceAttemptHTTP2-t, az újabb kiadásokban pedig a Protocols explicit konfigurációját ezekhez a választásokhoz.
A célnak továbbra is HTTP/2-t kell kínálnia TLS-egyeztetésen keresztül. Vizsgálja meg a sikeres válasz Proto vagy ProtoMajor értékét, hogy lássa, mit használtak. Az SOCKS-on keresztül sikeres HTTPS-kérés önmagában nem bizonyítja, hogy az egyeztetett protokoll HTTP/2 volt.