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)
}

Dentro de un paquete de red de Go existente, usa las importaciones context, errors, net, time y x/net/proxy. El argumento nil no selecciona credenciales SOCKS. Para un destino público en una ruta de proxy público permitida, la lista de proxies SOCKS5 ofrece candidatos para el extremo del dialer.

La aserción exportada proxy.ContextDialer hace que las implementaciones no compatibles fallen de forma explícita. Comprueba la dependencia desplegada en lugar de nombrar un tipo de dialer interno o iniciar una goroutine bloqueante que el llamador no pueda gestionar.

El context gobierna el establecimiento de la conexión. Una vez devuelto un net.Conn, aplica plazos de lectura/escritura adecuados o plazos de solicitud de nivel superior. El tiempo de espera de conexión del dialer base y el presupuesto total de una aplicación son límites distintos.

Para una integración de transporte HTTP, conserva su comportamiento normal de TLS y HTTP. El flujo SOCKS consciente del context que se devuelve es la entrega al transporte, no una respuesta ni una política de vida útil para todos los bytes posteriores.

Artículos relacionados