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 прокси тизмеси dialer-дин акыркы чекити үчүн талапкерлерди сунуштайт.

Экспорттолгон proxy.ContextDialer ырастоосу колдоого алынбаган ишке ашыруулардын ачык ишке ашпай калышына алып келет. Ички dialer түрүн атоонун же чакыруучу башкара албаган бөгөттөөчү goroutine баштоонун ордуна жайгаштырылган көз карандылыкты текшериңиз.

Контекст байланышты түзүүнү башкарат. net.Conn кайтарылгандан кийин тиешелүү окуу/жазуу же жогорку деңгээлдеги суроо мөөнөттөрүн колдонуңуз. Негизги dialer байланышынын тайм-ауту жана колдонмонун жалпы бюджети ар кандай чектөөлөр.

HTTP транспортун интеграциялоо үчүн анын кадимки TLS жана HTTP жүрүм-турумун сактаңыз. Кайтарылган контекстти билген SOCKS агымы транспортко өткөрүп берүү болуп саналат, жооп да, кийинки бардык байттар үчүн өмүр бою саясат да эмес.

Тектеш макалалар