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.