Позволить контексту 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-поток, учитывающий контекст, — это передача транспорту, а не ответ и не политика времени жизни для всех последующих байт.