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 dun paquete de rede de Go existente, usa as importacións context, errors, net, time e x/net/proxy. O argumento nil non selecciona credenciais SOCKS. Para un destino público nunha ruta de proxy público permitida, a lista de proxies SOCKS5 ofrece candidatos para o extremo do dialer.

A aserción exportada proxy.ContextDialer fai que as implementacións non compatibles fallen de forma explícita. Comproba a dependencia despregada en lugar de nomear un tipo de dialer interno ou iniciar unha goroutine bloqueante que o chamador non poida xestionar.

O contexto goberna o establecemento da conexión. Unha vez devolto un net.Conn, aplica prazos de lectura/escritura axeitados ou prazos de solicitude de nivel superior. O tempo de espera de conexión do dialer base e o orzamento total dunha aplicación son límites distintos.

Para unha integración de transporte HTTP, conserva o seu comportamento normal de TLS e HTTP. O fluxo SOCKS consciente do contexto que se devolve é a entrega ao transporte, non unha resposta nin unha política de vida útil para todos os bytes posteriores.

Artigos relacionados