Een SOCKS-tunnel vervoert één TCP-verbinding. Go kan via die tunnel TLS met de bestemming doen en daar HTTP/2 onderhandelen; de SOCKS-server hoeft zelf geen HTTP/2 te spreken.

Kloon in een programma dat het standaardtransport van Go behoudt de configuratie en selecteer de 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,
}

De proxy en de bestemming blijven verschillende waarden. Selecteer een SOCKS5-eindpunt uit de SOCKS5-proxylijst voor de proxywaarde; HTTP/2 wordt nog steeds met de bestemming onderhandeld. Gebruik client om de echte HTTPS-service-URL op te vragen en sluit daarna de responsbody via de normale levenscyclus van de applicatie.

Het standaardtransport ondersteunt HTTP/2. Door het te klonen blijft die configuratie behouden terwijl de proxykeuze kan veranderen. De type-assertie gaat ervan uit dat het programma http.DefaultTransport niet door een andere RoundTripper heeft vervangen.

Bekijk voor een apart gebouwd transport de HTTP/2-configuratie, vooral bij het leveren van aangepaste dial- of TLS-hooks. Go stelt ForceAttemptHTTP2 beschikbaar en, in nieuwere releases, expliciete Protocols-configuratie voor die keuzes.

De bestemming moet nog steeds HTTP/2 bieden via TLS-onderhandeling. Inspecteer de Proto- of ProtoMajor-waarde van de geslaagde respons om te zien wat is gebruikt. Een HTTPS-verzoek dat via SOCKS slaagt, bewijst op zichzelf niet dat het onderhandelde protocol HTTP/2 was.

Gerelateerde artikelen