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.