Tunel SOCKS przenosi jedno połączenie TCP. Go może wykonać TLS z miejscem docelowym przez ten tunel i wynegocjować tam HTTP/2; sam serwer SOCKS nie musi mówić po HTTP/2.

W programie, który zachowuje standardowy domyślny transport Go, sklonuj jego konfigurację i wybierz 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,
}

Proxy i miejsce docelowe pozostają różnymi wartościami. Dla wartości proxy wybierz punkt końcowy SOCKS5 z listy proxy SOCKS5; HTTP/2 nadal jest negocjowane z miejscem docelowym. Użyj client, aby zażądać rzeczywistego adresu URL usługi HTTPS, a następnie zamknij treść odpowiedzi w zwykłym cyklu życia aplikacji.

Standardowy domyślny transport obsługuje HTTP/2. Sklonowanie go zachowuje tę konfigurację i pozwala zmienić wybór proxy. Sprawdzenie typu zakłada, że program nie zastąpił http.DefaultTransport innym RoundTripperem.

W przypadku osobno zbudowanego transportu przejrzyj jego konfigurację HTTP/2, zwłaszcza gdy podajesz niestandardowe haki dial lub TLS. Go udostępnia ForceAttemptHTTP2, a w nowszych wersjach jawną konfigurację Protocols dla tych wyborów.

Miejsce docelowe nadal musi oferować HTTP/2 poprzez negocjację TLS. Sprawdź wartość Proto lub ProtoMajor udanej odpowiedzi, aby zobaczyć, co zostało użyte. Udane żądanie HTTPS przez SOCKS samo w sobie nie dowodzi, że wynegocjowanym protokołem było HTTP/2.

Powiązane artykuły