อุโมงค์ 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

บทความที่เกี่ยวข้อง