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-а.

Експортираното assertion proxy.ContextDialer кара неподдържаните реализации да се провалят явно. Проверете внедрената зависимост, вместо да назовавате вътрешен тип dialer или да стартирате блокираща goroutine, която извикващият не може да управлява.

Контекстът управлява установяването на връзката. След като net.Conn бъде върнат, приложете подходящи срокове за четене/запис или срокове за заявка на по-високо ниво. Таймаутът на връзката на базовия dialer и общият бюджет на приложението са различни ограничения.

За интеграция с HTTP транспорт запазете нормалното му TLS и HTTP поведение. Върнатият SOCKS поток, съобразен с контекста, е предаването към транспорта, а не отговор или политика за жизнения цикъл на всички следващи байтове.

Подобни статии