Αφήστε ένα 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 είναι η παράδοση στη μεταφορά, όχι μια απάντηση ή μια πολιτική διάρκειας ζωής για όλα τα επόμενα byte.