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

Într-un pachet de rețea Go existent, folosiți importurile context, errors, net, time și x/net/proxy. Argumentul nil nu selectează nicio acreditare SOCKS. Pentru o destinație publică pe o rută de proxy public permisă, lista de proxy SOCKS5 oferă candidați pentru punctul final al dialerului.

Aserțiunea exportată proxy.ContextDialer face ca implementările neacceptate să eșueze explicit. Verificați dependența implementată în loc să numiți un tip de dialer intern sau să porniți o goroutine blocantă pe care apelantul nu o poate gestiona.

Contextul guvernează stabilirea conexiunii. După ce un net.Conn este returnat, aplicați termene de citire/scriere adecvate sau termene de cerere de nivel superior. Timeout-ul de conexiune al unui dialer de bază și bugetul total al unei aplicații sunt limite diferite.

Pentru o integrare de transport HTTP, păstrați comportamentul normal TLS și HTTP. Fluxul SOCKS conștient de context returnat este predarea către transport, nu un răspuns și nici o politică de durată de viață pentru toți octeții ulteriori.

Articole similare