Un tunnel SOCKS transporte une connexion TCP. Go peut effectuer TLS avec la destination à travers ce tunnel et y négocier HTTP/2 ; le serveur SOCKS n'a pas besoin de parler HTTP/2 lui-même.

Dans un programme qui conserve le transport par défaut standard de Go, clonez sa configuration et sélectionnez le 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,
}

Le proxy et la destination restent des valeurs distinctes. Sélectionnez un point de terminaison SOCKS5 dans la liste des proxies SOCKS5 pour la valeur du proxy ; HTTP/2 est toujours négocié avec la destination. Utilisez client pour demander l'URL réelle du service HTTPS, puis fermez le corps de la réponse via le cycle de vie normal de l'application.

Le transport par défaut standard prend en charge HTTP/2. Le cloner conserve cette configuration tout en permettant de changer le choix du proxy. L'assertion de type suppose que le programme n'a pas remplacé http.DefaultTransport par un autre RoundTripper.

Pour un transport construit séparément, examinez sa configuration HTTP/2, en particulier lorsque vous fournissez des hooks dial ou TLS personnalisés. Go expose ForceAttemptHTTP2 et, dans les versions récentes, une configuration Protocols explicite pour ces choix.

La destination doit toujours proposer HTTP/2 via la négociation TLS. Inspectez la valeur Proto ou ProtoMajor de la réponse réussie pour voir ce qui a été utilisé. Une requête HTTPS qui réussit via SOCKS ne prouve pas à elle seule que le protocole négocié était HTTP/2.

Articles similaires