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.

Σχετικά άρθρα