การแปลงชื่อโฮสต์ SOCKS5 ในไคลเอนต์ HTTP ของ Go
ทำความเข้าใจว่าทำไม socks5 และ socks5h จึงไม่เลือกโหมด DNS ต่างกันใน HTTP transport มาตรฐานของ Go
ใน HTTP transport มาตรฐานของ Go 1.27.3 นั้น socks5 และ socks5h จัดการชื่อปลายทางแบบเดียวกัน เป้าหมายที่ระบุเป็นชื่อโฮสต์จะถูกส่งไปยังพร็อกซีในรูปชื่อโฮสต์ การสลับระหว่าง scheme เหล่านี้ไม่ได้สลับ ระหว่าง DNS ในเครื่องกับ DNS ระยะไกลเหมือนใน 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)
}
แทนที่ที่อยู่สำหรับเอกสารด้วยปลายทาง SOCKS5 ของคุณ โดยดูตัวเลือกได้ใน รายการพร็อกซี SOCKS5 ตัวอย่างนี้ใช้ transport ของ net/http เอง ส่วนไลบรารี Go อื่นอาจมีพฤติกรรมต่างออกไป
ยังต้องแยกชื่อสองส่วนออกจากกัน ที่อยู่พร็อกซีแบบตัวเลขไม่ต้องค้นหาชื่อโฮสต์ของพร็อกซี แต่พร็อกซีที่ระบุด้วยชื่อจะต้องถูกค้นพบในเครื่องก่อนส่งคำขอ SOCKS ส่วนปลายทางแบบตัวเลขไม่มีชื่อเป้าหมายให้แปลง จึงแสดงการจัดการชื่อโฮสต์ไม่ได้ หากต้องการตรวจสอบสิ่งที่ SOCKS เลือกจริง ให้ดูว่าฟิลด์ปลายทางมีชื่อหรือที่อยู่
transport มาตรฐานรองรับ proxy scheme http, https, socks5 และ socks5h ป้าย SOCKS ทั่วไปไม่ได้ยืนยันว่าปลายทางนั้นรองรับ SOCKS5 ตัวอย่างนี้ส่ง HTTP ผ่าน TCP และไม่ได้ทดสอบคำสั่ง SOCKS อื่นหรือการส่งต่อ UDP