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.

Ähnliche Artikel