Låt en Go-kontext avbryta upprättandet av SOCKS-anslutningen
Använd det exporterade ContextDialer-gränssnittet för en Go-SOCKS-väg och skilj anslutningsavbrott från tidsgränser på senare applikationstrafik.
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)
}I ett befintligt Go-nätverkspaket använder du importerna context, errors, net, time och x/net/proxy. nil-argumentet väljer inga SOCKS-inloggningsuppgifter. För ett offentligt mål på en tillåten offentlig proxyväg erbjuder SOCKS5-proxylistan kandidater för dialerns slutpunkt.
Det exporterade proxy.ContextDialer-påståendet får implementeringar som inte stöds att misslyckas explicit. Kontrollera det distribuerade beroendet i stället för att namnge en intern dialertyp eller starta en blockerande goroutine som anroparen inte kan hantera.
Kontexten styr upprättandet av anslutningen. När en net.Conn har returnerats, tillämpa lämpliga läs-/skrivtidsgränser eller tidsgränser för förfrågningar på högre nivå. En basdialers anslutningstimeout och en applikations totala budget är olika gränser.
För en HTTP-transportintegration behåller du dess normala TLS- och HTTP-beteende. Den returnerade kontextmedvetna SOCKS-strömmen är överlämningen till transporten, inte ett svar eller en livstidspolicy för alla senare byte.