Pozwól kontekstowi Go anulować nawiązywanie połączenia SOCKS
Użyj wyeksportowanego interfejsu ContextDialer dla ścieżki SOCKS w Go i odróżnij anulowanie połączenia od terminów późniejszego ruchu aplikacji.
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)
}W istniejącym pakiecie sieciowym Go użyj importów context, errors, net, time i x/net/proxy. Argument nil nie wybiera żadnych danych uwierzytelniających SOCKS. Dla publicznego celu na dozwolonej trasie publicznego proxy lista proxy SOCKS5 oferuje kandydatów na punkt końcowy dialera.
Wyeksportowana asercja proxy.ContextDialer sprawia, że nieobsługiwane implementacje jawnie zawodzą. Sprawdź wdrożoną zależność, zamiast nazywać wewnętrzny typ dialera lub uruchamiać blokującą goroutine, której wywołujący nie może zarządzać.
Kontekst rządzi nawiązaniem połączenia. Gdy net.Conn zostanie zwrócony, zastosuj odpowiednie terminy odczytu/zapisu lub terminy żądań wyższego poziomu. Limit czasu połączenia bazowego dialera i całkowity budżet aplikacji to różne ograniczenia.
W przypadku integracji transportu HTTP zachowaj jego normalne zachowanie TLS i HTTP. Zwrócony strumień SOCKS świadomy kontekstu jest przekazaniem do transportu, a nie odpowiedzią ani polityką czasu życia dla wszystkich późniejszych bajtów.