SOCKS-тунэль перадае TCP-злучэнне. Go можа выканаць TLS з пунктам прызначэння праз гэты тунэль і ўзгадніць там HTTP/2; сам SOCKS-сервер не павінен размаўляць на HTTP/2.

У праграме, якая захоўвае стандартны транспарт Go па змаўчанні, скапіюйце яго канфігурацыю і выберыце проксі:

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,
}

Проксі і пункт прызначэння застаюцца рознымі значэннямі. Для значэння проксі выберыце канчатковы пункт SOCKS5 са спісу SOCKS5-проксі; HTTP/2 па-ранейшаму ўзгадняецца з пунктам прызначэння. Выкарыстоўвайце client, каб запытаць сапраўдны URL службы HTTPS, затым закрыйце цела адказу праз звычайны жыццёвы цыкл праграмы.

Стандартны транспарт па змаўчанні падтрымлівае HTTP/2. Яго капіраванне захоўвае гэту канфігурацыю і дазваляе змяніць выбар проксі. Праверка тыпу мяркуе, што праграма не замяніла http.DefaultTransport іншым RoundTripper.

Для асобна створанага транспарту праглядзіце яго канфігурацыю HTTP/2, асабліва калі задаюцца ўласныя dial- або TLS-хукі. Go прадастаўляе ForceAttemptHTTP2 і, у новых выпусках, відавочную канфігурацыю Protocols для гэтых выбараў.

Пункт прызначэння ўсё яшчэ павінен прапаноўваць HTTP/2 праз узгадненне TLS. Праверце значэнне Proto або ProtoMajor у паспяховым адказе, каб убачыць, што было выкарыстана. Паспяховы запыт HTTPS праз SOCKS сам па сабе не даказвае, што ўзгоднены пратакол быў HTTP/2.

Падобныя артыкулы