Hayaang kanselahin ng context ng Go ang pag-set up ng koneksyong SOCKS
Gamitin ang na-export na interface ng ContextDialer para sa landas ng SOCKS sa Go at ibukod ang pagkansela ng koneksyon mula sa mga deadline ng susunod na trapiko ng aplikasyon.
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)
}Sa loob ng umiiral na pakete ng networking ng Go, gamitin ang mga import na context, errors, net, time at x/net/proxy. Hindi pumipili ang argumentong nil ng anumang kredensyal ng SOCKS. Para sa pampublikong destinasyon sa pinapayagang ruta ng pampublikong proxy, ang listahan ng proxy na SOCKS5 ay nag-aalok ng mga kandidato para sa endpoint ng dialer.
Ang na-export na assertion na proxy.ContextDialer ay nagiging dahilan ng tahasang pagpalya ng mga hindi sinusuportahang implementasyon. Suriin ang naka-deploy na dependency sa halip na pangalanan ang internal na uri ng dialer o magsimula ng humaharang na goroutine na hindi kayang pamahalaan ng tumatawag.
Pinamamahalaan ng context ang pag-set up ng koneksyon. Kapag naibalik na ang net.Conn, ilapat ang angkop na deadline ng pagbasa/pagsulat o deadline ng kahilingan sa mas mataas na antas. Ang timeout ng koneksyon ng base dialer at ang kabuuang badyet ng isang aplikasyon ay magkaibang limitasyon.
Para sa integrasyon ng HTTP na transport, panatilihin ang normal nitong pag-uugali sa TLS at HTTP. Ang ibinalik na stream ng SOCKS na may kamalayan sa context ay ang paghahatid sa transport, hindi isang tugon at hindi isang patakaran sa habang-buhay para sa lahat ng susunod na byte.