HTTP/2 mieści się w tunelu SOCKS Go
Sklonuj standardowy transport HTTP, wybierz proxy SOCKS i sprawdź protokół miejsca docelowego, który faktycznie został wynegocjowany.
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.