Дозволити контексту 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, якою виклик не може керувати.
Контекст керує встановленням з'єднання. Після повернення net.Conn застосовуйте відповідні строки читання/запису або строки запиту вищого рівня. Тайм-аут з'єднання базового dialer і загальний бюджет застосунку є різними обмеженнями.
Для інтеграції з транспортом HTTP зберігайте його звичайну поведінку TLS і HTTP. Повернутий SOCKS-потік, що враховує контекст, — це передавання транспорту, а не відповідь і не політика часу життя для всіх подальших байтів.