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)
}

Trong một gói mạng Go hiện có, dùng các import context, errors, net, time và x/net/proxy. Đối số nil không chọn thông tin xác thực SOCKS nào. Với một đích công khai trên tuyến proxy công khai được phép, danh sách proxy SOCKS5 gợi ý các ứng viên cho điểm cuối của dialer.

Khẳng định proxy.ContextDialer được xuất khiến các triển khai không được hỗ trợ thất bại một cách rõ ràng. Hãy kiểm tra phần phụ thuộc đã triển khai thay vì nêu tên một kiểu dialer nội bộ hay khởi động một goroutine chặn mà bên gọi không thể quản lý.

Context chi phối việc thiết lập kết nối. Sau khi net.Conn được trả về, hãy áp dụng hạn chót đọc/ghi phù hợp hoặc hạn chót yêu cầu ở mức cao hơn. Thời gian chờ kết nối của dialer cơ sở và ngân sách tổng của ứng dụng là những giới hạn khác nhau.

Với tích hợp vận chuyển HTTP, hãy giữ nguyên hành vi TLS và HTTP thông thường. Luồng SOCKS nhận biết context được trả về là việc bàn giao cho vận chuyển, không phải phản hồi và cũng không phải chính sách vòng đời cho mọi byte về sau.

Bài viết liên quan