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 ซึ่งส่งคืนคือการส่งมอบให้กับการขนส่ง ไม่ใช่การตอบสนองและไม่ใช่นโยบายอายุการใช้งานสำหรับไบต์ทั้งหมดในภายหลัง

บทความที่เกี่ยวข้อง