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

Unutar postojećeg Go mrežnog paketa koristite importe context, errors, net, time i x/net/proxy. Argument nil ne odabire nikakve SOCKS akreditive. Za javno odredište na dozvoljenoj ruti javnog proxyja, lista SOCKS5 proxyja nudi kandidate za krajnju tačku dialera.

Izvezena tvrdnja proxy.ContextDialer čini da nepodržane implementacije eksplicitno ne uspiju. Provjerite raspoređenu zavisnost umjesto da imenujete interni tip dialera ili pokrećete blokirajuću goroutine kojom pozivalac ne može upravljati.

Kontekst upravlja uspostavljanjem veze. Kada se net.Conn vrati, primijenite odgovarajuće rokove za čitanje/pisanje ili rokove zahtjeva višeg nivoa. Vremensko ograničenje veze osnovnog dialera i ukupni budžet aplikacije različita su ograničenja.

Za integraciju HTTP transporta zadržite njegovo normalno TLS i HTTP ponašanje. Vraćeni SOCKS tok svjestan konteksta je primopredaja transporta, a ne odgovor niti politika životnog vijeka za sve kasnije bajtove.

Povezani članci