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를 사용해 실제 HTTPS 서비스 URL을 요청한 다음, 애플리케이션의 일반적인 수명 주기로 응답 본문을 닫으세요.

표준 기본 전송은 HTTP/2를 지원합니다. 이를 복제하면 그 구성이 유지되면서 프록시 선택을 바꿀 수 있습니다. 타입 단언은 프로그램이 http.DefaultTransport를 다른 RoundTripper로 교체하지 않았다고 가정합니다.

별도로 구성한 전송의 경우, 특히 사용자 지정 dial 또는 TLS 훅을 제공할 때 그 HTTP/2 구성을 검토하세요. Go는 ForceAttemptHTTP2를, 최신 릴리스에서는 이런 선택을 위한 명시적 Protocols 구성을 노출합니다.

대상은 여전히 TLS 협상을 통해 HTTP/2를 제공해야 합니다. 성공한 응답의 Proto 또는 ProtoMajor 값을 확인해 무엇이 사용되었는지 보세요. SOCKS를 통한 HTTPS 요청의 성공만으로는 협상된 프로토콜이 HTTP/2였다는 것이 증명되지 않습니다.

관련 글