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.

Aiheeseen liittyvät artikkelit