Biarkan konteks Go membatalkan penyiapan koneksi SOCKS
Gunakan antarmuka ContextDialer yang diekspor untuk jalur SOCKS Go dan bedakan pembatalan koneksi dari tenggat pada lalu lintas aplikasi berikutnya.
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)
}Dalam paket jaringan Go yang sudah ada, gunakan impor context, errors, net, time, dan x/net/proxy. Argumen nil tidak memilih kredensial SOCKS. Untuk tujuan publik pada rute proxy publik yang diizinkan, daftar proxy SOCKS5 menawarkan kandidat untuk titik akhir dialer.
Pernyataan proxy.ContextDialer yang diekspor membuat implementasi yang tidak didukung gagal secara eksplisit. Periksa dependensi yang dipasang alih-alih menyebut tipe dialer internal atau memulai goroutine pemblokir yang tidak dapat dikelola pemanggil.
Konteks mengatur penyiapan koneksi. Setelah net.Conn dikembalikan, terapkan tenggat baca/tulis yang sesuai atau tenggat permintaan tingkat lebih tinggi. Batas waktu koneksi dialer dasar dan anggaran total aplikasi adalah batas yang berbeda.
Untuk integrasi transport HTTP, pertahankan perilaku TLS dan HTTP normalnya. Aliran SOCKS sadar-konteks yang dikembalikan adalah penyerahan ke transport, bukan respons dan bukan kebijakan masa pakai untuk semua bita berikutnya.