Biarkan konteks Go membatalkan persediaan sambungan SOCKS
Gunakan antara muka ContextDialer yang dieksport untuk laluan SOCKS Go dan bezakan pembatalan sambungan daripada tarikh akhir pada trafik aplikasi kemudian.
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 pakej rangkaian Go sedia ada, gunakan import context, errors, net, time dan x/net/proxy. Argumen nil tidak memilih sebarang kelayakan SOCKS. Untuk destinasi awam pada laluan proksi awam yang dibenarkan, senarai proksi SOCKS5 menawarkan calon untuk titik akhir dialer.
Penegasan proxy.ContextDialer yang dieksport menyebabkan pelaksanaan tidak disokong gagal secara eksplisit. Semak kebergantungan yang digunakan dan bukannya menamakan jenis dialer dalaman atau memulakan goroutine penyekat yang pemanggil tidak dapat menguruskan.
Konteks mengawal persediaan sambungan. Selepas net.Conn dikembalikan, gunakan tarikh akhir baca/tulis yang sesuai atau tarikh akhir permintaan peringkat lebih tinggi. Had masa sambungan dialer asas dan belanjawan keseluruhan aplikasi ialah had yang berbeza.
Untuk integrasi pengangkutan HTTP, kekalkan tingkah laku TLS dan HTTP biasa. Aliran SOCKS sedar konteks yang dikembalikan ialah penyerahan kepada pengangkutan, bukan respons dan bukan dasar jangka hayat untuk semua bait berikutnya.