HTTP/2 mahtuu Gon SOCKS-tunnelin sisään
Kloonaa vakio-HTTP-siirtokerros, valitse SOCKS-välityspalvelin ja tarkastele kohdeprotokollaa, joka todella neuvoteltiin.
SOCKS-tunneli kuljettaa TCP-yhteyden. Go voi tehdä TLS:n kohteen kanssa tunnelin kautta ja neuvotella siellä HTTP/2:n; SOCKS-palvelimen ei itse tarvitse puhua HTTP/2:ta.
Ohjelmassa, joka säilyttää Gon vakio-oletussiirtokerroksen, kloonaa sen asetukset ja valitse välityspalvelin:
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,
}
Välityspalvelin ja kohde pysyvät eri arvoina. Valitse välityspalvelimen arvoksi SOCKS5-päätepiste SOCKS5-välityspalvelinluettelosta; HTTP/2 neuvotellaan edelleen kohteen kanssa. Pyydä clientillä todellinen HTTPS-palvelun URL ja sulje sitten vastauksen runko sovelluksen tavallisen elinkaaren kautta.
Vakio-oletussiirtokerros tukee HTTP/2:ta. Sen kloonaaminen säilyttää tämän asetelman ja sallii välityspalvelinvalinnan muuttamisen. Tyypin tarkistus olettaa, ettei ohjelma ole korvannut http.DefaultTransportia toisella RoundTripperilla.
Erikseen rakennetun siirtokerroksen kohdalla tarkista sen HTTP/2-asetukset, erityisesti kun annetaan mukautettuja dial- tai TLS-koukkuja. Go paljastaa ForceAttemptHTTP2:n ja uudemmissa versioissa näille valinnoille erillisen Protocols-asetuksen.
Kohteen on yhä tarjottava HTTP/2 TLS-neuvottelun kautta. Tarkista onnistuneen vastauksen Proto- tai ProtoMajor-arvo nähdäksesi, mitä käytettiin. SOCKSin kautta onnistunut HTTPS-pyyntö ei itsessään todista, että neuvoteltu protokolla oli HTTP/2.