ໃຫ້ 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 ທີ່ສົ່ງຄືນແມ່ນການສົ່ງຕໍ່ໃຫ້ການຂົນສົ່ງ, ບໍ່ແມ່ນການຕອບສະໜອງ ແລະ ບໍ່ແມ່ນນະໂຍບາຍອາຍຸການໃຊ້ສຳລັບທຸກໄບຕ໌ຕໍ່ໄປ.