Дазволіць кантэксту Go скасаваць усталяванне злучэння SOCKS
Выкарыстоўвайце экспартаваны інтэрфейс ContextDialer для шляху SOCKS у Go і адрознівайце скасаванне злучэння ад тэрмінаў для далейшага трафіку праграмы.
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)
}У існуючым сеткавым пакеце Go выкарыстоўвайце імпарты context, errors, net, time і x/net/proxy. Аргумент nil не выбірае ніякіх уліковых даных SOCKS. Для публічнага прызначэння на дазволеным маршруце публічнага проксі спіс проксі SOCKS5 прапануе кандыдатаў для канчатковай кропкі дыялера.
Экспартаванае сцвярджэнне proxy.ContextDialer прымушае непадтрыманыя рэалізацыі явна памыляцца. Правярайце разгорнутую залежнасць, а не называйце ўнутраны тып дыялера і не запускайце блокуючую горуціну, якой выклікальнік не можа кіраваць.
Кантэкст кіруе ўсталяваннем злучэння. Пасля вяртання net.Conn прымяняйце адпаведныя тэрміны чытання/запісу або тэрміны запыту больш высокага ўзроўню. Тайм-аўт злучэння базавага дыялера і агульны бюджэт праграмы — розныя межы.
Для інтэграцыі з транспартам HTTP захоўвайце яго звычайныя паводзіны TLS і HTTP. Вернуты SOCKS-паток, які ўлічвае кантэкст, — гэта перадача транспарту, а не адказ і не палітыка часу жыцця для ўсіх наступных байтаў.