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.