Το HTTP/2 χωράει μέσα στο τούνελ SOCKS της Go
Κλωνοποιήστε τη βασική μεταφορά 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 για να ζητήσετε το πραγματικό URL της υπηρεσίας HTTPS και μετά κλείστε το σώμα της απόκρισης μέσω του συνήθους κύκλου ζωής της εφαρμογής.
Η βασική προεπιλεγμένη μεταφορά υποστηρίζει HTTP/2. Η κλωνοποίησή της διατηρεί αυτή τη διαμόρφωση ενώ επιτρέπει να αλλάξει η επιλογή διαμεσολαβητή. Η δήλωση τύπου υποθέτει ότι το πρόγραμμα δεν έχει αντικαταστήσει το http.DefaultTransport με άλλο RoundTripper.
Για μια μεταφορά που έχει κατασκευαστεί ξεχωριστά, εξετάστε τη διαμόρφωση HTTP/2, ειδικά όταν παρέχετε προσαρμοσμένα άγκιστρα dial ή TLS. Η Go εκθέτει το ForceAttemptHTTP2 και, σε νεότερες εκδόσεις, ρητή διαμόρφωση Protocols για αυτές τις επιλογές.
Ο προορισμός πρέπει ακόμη να προσφέρει HTTP/2 μέσω διαπραγμάτευσης TLS. Ελέγξτε την τιμή Proto ή ProtoMajor της επιτυχημένης απόκρισης για να δείτε τι χρησιμοποιήθηκε. Ένα αίτημα HTTPS που πετυχαίνει μέσω SOCKS δεν αποδεικνύει από μόνο του ότι το διαπραγματευόμενο πρωτόκολλο ήταν HTTP/2.