HTTP/2 працуе ўнутры SOCKS-тунэля Go
Скапіюйце стандартны транспарт HTTP, выберыце SOCKS-проксі і праверце пратакол прызначэння, які фактычна быў узгоднены.
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.