Resolusi Nama Host SOCKS5 dalam Klien HTTP Go
Pahami mengapa socks5 dan socks5h tidak memilih mode DNS berbeda pada transport HTTP standar Go.
Dalam transport HTTP standar Go 1.27.3, socks5 dan socks5h menangani nama tujuan dengan cara yang sama. Target bernama host dikirim ke proksi sebagai nama host. Mengganti skema tersebut tidak beralih antara DNS lokal dan jarak jauh seperti pada curl.
package main
import (
"fmt"
"log"
"net/http"
"net/url"
"time"
)
func main() {
proxyURL, err := url.Parse("socks5://203.0.113.10:1080")
if err != nil {
log.Fatal(err)
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
defer transport.CloseIdleConnections()
client := &http.Client{
Transport: transport,
Timeout: 15 * time.Second,
}
response, err := client.Get("https://example.com/")
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
fmt.Println(response.StatusCode)
}
Ganti alamat dokumentasi dengan endpoint SOCKS5 Anda; kandidat dapat dilihat di daftar proksi SOCKS5. Contoh memakai transport milik net/http sendiri; pustaka Go lain dapat menerapkan perilaku berbeda.
Dua nama tetap perlu dibedakan. Alamat proksi numerik tidak memerlukan pencarian host proksi; proksi bernama harus ditemukan secara lokal sebelum permintaan SOCKS dapat dikirim. Tujuan numerik tidak memiliki nama target untuk diresolusikan dan tidak membuktikan penanganan nama host. Untuk memeriksa pilihan SOCKS yang sebenarnya, lihat apakah kolom tujuan berisi nama atau alamat.
Transport standar mendukung skema proksi http, https, socks5, dan socks5h. Label SOCKS umum tidak membuktikan dukungan SOCKS5 pada endpoint. Contoh ini mengirim HTTP melalui TCP dan tidak menguji perintah SOCKS lain atau relai UDP.