Einen Go-Kontext den SOCKS-Verbindungsaufbau abbrechen lassen
Nutzen Sie das exportierte ContextDialer-Interface für einen Go-SOCKS-Pfad und unterscheiden Sie Verbindungsabbruch von Deadlines für späteren Anwendungsverkehr.
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)
}In einem bestehenden Go-Netzwerkpaket verwenden Sie die Importe context, errors, net, time und x/net/proxy. Das nil-Argument wählt keine SOCKS-Anmeldedaten. Für ein öffentliches Ziel auf einer erlaubten öffentlichen Proxy-Route bietet die SOCKS5-Proxy-Liste Kandidaten für den Endpunkt des Dialers.
Die exportierte proxy.ContextDialer-Zusicherung lässt nicht unterstützte Implementierungen ausdrücklich fehlschlagen. Prüfen Sie die ausgelieferte Abhängigkeit, statt einen internen Dialer-Typ zu benennen oder eine blockierende Goroutine zu starten, die der Aufrufer nicht verwalten kann.
Der Kontext steuert den Verbindungsaufbau. Sobald eine net.Conn zurückgegeben wird, wenden Sie geeignete Lese-/Schreib- oder Anforderungs-Deadlines auf höherer Ebene an. Das Verbindungs-Timeout eines Basis-Dialers und das Gesamtbudget einer Anwendung sind unterschiedliche Grenzen.
Bei einer HTTP-Transport-Integration behalten Sie dessen normales TLS- und HTTP-Verhalten bei. Der zurückgegebene kontextbewusste SOCKS-Stream ist die Übergabe an den Transport, keine Antwort und keine Lebensdauerrichtlinie für alle späteren Bytes.