HTTP/2 ეტევა Go-ს SOCKS გვირაბში
დააკლონეთ სტანდარტული HTTP ტრანსპორტი, აირჩიეთ SOCKS პროქსი და შეამოწმეთ სამიზნე პროტოკოლი, რომელზეც რეალურად შედგა შეთანხმება.
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 იყო.