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 um pacote de rede Go existente, use as importações context, errors, net, time e x/net/proxy. O argumento nil não seleciona credenciais SOCKS. Para um destino público numa rota de proxy público permitida, a lista de proxies SOCKS5 oferece candidatos para o endpoint do dialer.

A asserção exportada proxy.ContextDialer faz com que implementações não suportadas falhem explicitamente. Verifique a dependência implantada em vez de nomear um tipo de dialer interno ou iniciar uma goroutine bloqueante que o chamador não consegue gerenciar.

O context governa o estabelecimento da conexão. Depois de um net.Conn ser retornado, aplique prazos de leitura/escrita adequados ou prazos de requisição de nível superior. O tempo limite de conexão de um dialer base e o orçamento total de uma aplicação são limites diferentes.

Para uma integração de transporte HTTP, mantenha o seu comportamento normal de TLS e HTTP. O fluxo SOCKS ciente do context retornado é a entrega ao transporte, não uma resposta nem uma política de tempo de vida para todos os bytes posteriores.

Artigos relacionados