SOCKS გვირაბი TCP კავშირს გადაიტანს. Go-ს შეუძლია ამ გვირაბის გავლით სამიზნესთან TLS შეასრულოს და იქ HTTP/2-ზე შეთანხმდეს; თავად SOCKS სერვერს HTTP/2-ზე საუბარი არ სჭირდება.

პროგრამაში, რომელიც Go-ს სტანდარტულ ნაგულისხმევ ტრანსპორტს ინარჩუნებს, დააკლონეთ მისი კონფიგურაცია და აირჩიეთ პროქსი:

import (
    "net/http"
    "net/url"
    "time"
)

proxyURL := &url.URL{
    Scheme: "socks5",
    Host: "proxy.example:1080",
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
client := &http.Client{
    Transport: transport,
    Timeout: 30 * time.Second,
}

პროქსი და სამიზნე სხვადასხვა მნიშვნელობად რჩება. პროქსის მნიშვნელობისთვის აირჩიეთ SOCKS5 ბოლო წერტილი SOCKS5 პროქსების სიიდან; HTTP/2 მაინც სამიზნესთან შეთანხმდება. გამოიყენეთ client რეალური HTTPS სერვისის URL-ის მოსათხოვნად, შემდეგ დახურეთ პასუხის სხეული აპლიკაციის ჩვეულებრივი სასიცოცხლო ციკლით.

სტანდარტული ნაგულისხმევი ტრანსპორტი HTTP/2-ს მხარს უჭერს. მისი კლონირება ინარჩუნებს ამ კონფიგურაციას და პროქსის არჩევანის შეცვლის საშუალებას იძლევა. ტიპის შემოწმება ვარაუდობს, რომ პროგრამამ http.DefaultTransport სხვა RoundTripper-ით არ შეცვალა.

ცალკე აწყობილი ტრანსპორტისთვის გადახედეთ მის HTTP/2 კონფიგურაციას, განსაკუთრებით მაშინ, როცა მორგებულ dial ან TLS კაუჭებს აწვდით. Go ამჟღავნებს ForceAttemptHTTP2-ს და უფრო ახალ გამოშვებებში ამ არჩევანებისთვის აშკარა Protocols კონფიგურაციას.

სამიზნემ მაინც უნდა შესთავაზოს HTTP/2 TLS მოლაპარაკების გავლით. შეამოწმეთ წარმატებული პასუხის Proto ან ProtoMajor მნიშვნელობა, რომ ნახოთ რა გამოიყენეს. SOCKS-ის გავლით წარმატებული HTTPS მოთხოვნა თავისთავად არ ამტკიცებს, რომ შეთანხმებული პროტოკოლი HTTP/2 იყო.

დაკავშირებული სტატიები