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 uvoze context, errors, net, time i x/net/proxy. Argument nil ne odabire nikakve SOCKS vjerodajnice. Za javno odredište na dopuštenoj ruti javnog proxyja popis SOCKS5 proxyja nudi kandidate za krajnju točku dialera.

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

Kontekst upravlja uspostavljanjem veze. Kad se vrati net.Conn, primijenite odgovarajuće rokove za čitanje/pisanje ili rokove zahtjeva više razine. Vremensko ograničenje veze osnovnog dialera i ukupni proračun aplikacije različita su ograničenja.

Za integraciju HTTP prometa zadržite njegovo uobičajeno TLS i HTTP ponašanje. Vraćeni SOCKS tok svjestan konteksta je primopredaja prometu, a ne odgovor ni politika trajanja za sve kasnije bajtove.

Povezani članci