Go კონტექსტს მიეცით SOCKS კავშირის დამყარების გაუქმების საშუალება
გამოიყენეთ ექსპორტირებული ContextDialer ინტერფეისი Go-ს SOCKS მარშრუტისთვის და განასხვავეთ კავშირის გაუქმება მოგვიანებით აპლიკაციის ტრაფიკის ვადებისგან.
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 ნაკადი ტრანსპორტისთვის გადაცემაა, არა პასუხი და არა სიცოცხლის ხანგრძლივობის პოლიტიკა ყველა შემდგომი ბაიტისთვის.