ให้ context ของ Go ยกเลิกการตั้งค่าการเชื่อมต่อ SOCKS
ใช้อินเทอร์เฟซ ContextDialer ที่ส่งออกสำหรับเส้นทาง SOCKS ใน Go และแยกการยกเลิกการเชื่อมต่อออกจากกำหนดเวลาของทราฟฟิกแอปพลิเคชันในภายหลัง
func dialViaSOCKS(ctx context.Context, destination string) (net.Conn, error) {
dialer, err := proxy.SOCKS5(
"tcp",
"127.0.0.1:1080",
nil,
&net.Dialer{Timeout: 5 * time.Second},
)
if err != nil {
return nil, err
}
contextDialer, ok := dialer.(proxy.ContextDialer)
if !ok {
return nil, errors.New("SOCKS dialer lacks context support")
}
return contextDialer.DialContext(ctx, "tcp", destination)
}ภายในแพ็กเกจเครือข่าย Go ที่มีอยู่ ใช้การนำเข้า context, errors, net, time และ x/net/proxy อาร์กิวเมนต์ nil ไม่เลือกข้อมูลรับรอง SOCKS ใด ๆ สำหรับปลายทางสาธารณะบนเส้นทางพร็อกซีสาธารณะที่ได้รับอนุญาต รายการพร็อกซี SOCKS5 เสนอผู้สมัครสำหรับปลายทางของ dialer
การยืนยัน proxy.ContextDialer ที่ส่งออกทำให้การใช้งานที่ไม่รองรับล้มเหลวอย่างชัดเจน ตรวจสอบการพึ่งพาที่ติดตั้งไว้แทนการระบุชนิด dialer ภายในหรือเริ่ม goroutine ที่บล็อกซึ่งผู้เรียกไม่สามารถจัดการได้
context ควบคุมการสร้างการเชื่อมต่อ เมื่อ net.Conn ถูกส่งคืน ให้ใช้กำหนดเวลาการอ่าน/เขียนที่เหมาะสมหรือกำหนดเวลาคำขอระดับที่สูงขึ้น การหมดเวลาการเชื่อมต่อของ dialer พื้นฐานและงบประมาณรวมของแอปพลิเคชันเป็นขีดจำกัดที่ต่างกัน
สำหรับการผสานการขนส่ง HTTP ให้รักษาพฤติกรรม TLS และ HTTP ปกติไว้ สตรีม SOCKS ที่รับรู้ context ซึ่งส่งคืนคือการส่งมอบให้กับการขนส่ง ไม่ใช่การตอบสนองและไม่ใช่นโยบายอายุการใช้งานสำหรับไบต์ทั้งหมดในภายหลัง