HTTP/2 masuk ke dalam terowongan SOCKS Go
Klon transport HTTP standar, pilih proksi SOCKS, dan periksa protokol tujuan yang benar-benar dinegosiasikan.
Terowongan SOCKS membawa satu koneksi TCP. Go dapat melakukan TLS dengan tujuan melalui terowongan itu dan menegosiasikan HTTP/2 di sana; server SOCKS sendiri tidak perlu berbicara HTTP/2.
Dalam program yang mempertahankan transport default standar Go, klon konfigurasinya dan pilih proksi:
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,
}
Proksi dan tujuan tetap merupakan nilai yang berbeda. Pilih endpoint SOCKS5 dari daftar proksi SOCKS5 untuk nilai proksi; HTTP/2 tetap dinegosiasikan dengan tujuan. Gunakan client untuk meminta URL layanan HTTPS yang sebenarnya, lalu tutup badan respons melalui siklus hidup normal aplikasi.
Transport default standar mendukung HTTP/2. Mengkloningnya mempertahankan konfigurasi itu sekaligus memungkinkan pilihan proksi berubah. Asersi tipe mengasumsikan program belum mengganti http.DefaultTransport dengan RoundTripper lain.
Untuk transport yang dibangun terpisah, tinjau konfigurasi HTTP/2-nya, terutama saat menyediakan hook dial atau TLS khusus. Go mengekspos ForceAttemptHTTP2 dan, pada rilis yang lebih baru, konfigurasi Protocols eksplisit untuk pilihan tersebut.
Tujuan tetap harus menawarkan HTTP/2 melalui negosiasi TLS. Periksa nilai Proto atau ProtoMajor dari respons yang berhasil untuk melihat apa yang digunakan. Permintaan HTTPS yang berhasil melalui SOCKS tidak dengan sendirinya membuktikan bahwa protokol yang dinegosiasikan adalah HTTP/2.