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

Sa loob ng umiiral na pakete ng networking ng Go, gamitin ang mga import na context, errors, net, time at x/net/proxy. Hindi pumipili ang argumentong nil ng anumang kredensyal ng SOCKS. Para sa pampublikong destinasyon sa pinapayagang ruta ng pampublikong proxy, ang listahan ng proxy na SOCKS5 ay nag-aalok ng mga kandidato para sa endpoint ng dialer.

Ang na-export na assertion na proxy.ContextDialer ay nagiging dahilan ng tahasang pagpalya ng mga hindi sinusuportahang implementasyon. Suriin ang naka-deploy na dependency sa halip na pangalanan ang internal na uri ng dialer o magsimula ng humaharang na goroutine na hindi kayang pamahalaan ng tumatawag.

Pinamamahalaan ng context ang pag-set up ng koneksyon. Kapag naibalik na ang net.Conn, ilapat ang angkop na deadline ng pagbasa/pagsulat o deadline ng kahilingan sa mas mataas na antas. Ang timeout ng koneksyon ng base dialer at ang kabuuang badyet ng isang aplikasyon ay magkaibang limitasyon.

Para sa integrasyon ng HTTP na transport, panatilihin ang normal nitong pag-uugali sa TLS at HTTP. Ang ibinalik na stream ng SOCKS na may kamalayan sa context ay ang paghahatid sa transport, hindi isang tugon at hindi isang patakaran sa habang-buhay para sa lahat ng susunod na byte.

Kaugnay na mga artikulo