HTTP/2 passt in Go's SOCKS-Tunnel
Klonen Sie den Standard-HTTP-Transport, wählen Sie den SOCKS-Proxy und prüfen Sie das tatsächlich ausgehandelte Zielprotokoll.
Ein SOCKS-Tunnel transportiert eine TCP-Verbindung. Go kann über diesen Tunnel TLS mit dem Ziel durchführen und dort HTTP/2 aushandeln; der SOCKS-Server muss selbst kein HTTP/2 sprechen.
In einem Programm, das den Standard-Transport von Go beibehält, klonen Sie dessen Konfiguration und wählen den Proxy aus:
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,
}
Proxy und Ziel bleiben unterschiedliche Werte. Wählen Sie für den Proxy-Wert einen SOCKS5-Endpunkt aus der SOCKS5-Proxy-Liste; HTTP/2 wird weiterhin mit dem Ziel ausgehandelt. Verwenden Sie client, um die echte HTTPS-Dienst-URL anzufordern, und schließen Sie dann den Antwortkörper über den normalen Lebenszyklus der Anwendung.
Der Standard-Transport unterstützt HTTP/2. Das Klonen behält diese Konfiguration bei und erlaubt zugleich, die Proxy-Wahl zu ändern. Die Typzusicherung setzt voraus, dass das Programm http.DefaultTransport nicht durch einen anderen RoundTripper ersetzt hat.
Prüfen Sie bei einem separat aufgebauten Transport dessen HTTP/2-Konfiguration, insbesondere wenn eigene dial- oder TLS-Hooks bereitgestellt werden. Go stellt ForceAttemptHTTP2 und in neueren Versionen eine explizite Protocols-Konfiguration für diese Entscheidungen bereit.
Das Ziel muss HTTP/2 weiterhin über die TLS-Aushandlung anbieten. Prüfen Sie den Proto- oder ProtoMajor-Wert der erfolgreichen Antwort, um zu sehen, was verwendet wurde. Eine über SOCKS erfolgreiche HTTPS-Anfrage belegt für sich genommen nicht, dass das ausgehandelte Protokoll HTTP/2 war.