ينقل نفق 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 الحقيقي، ثم أغلق جسم الاستجابة عبر دورة الحياة المعتادة للتطبيق.

يدعم الناقل الافتراضي القياسي HTTP/2. واستنساخه يحتفظ بذلك الإعداد مع السماح بتغيير اختيار الوكيل. ويفترض تحويل النوع أن البرنامج لم يستبدل http.DefaultTransport بـ RoundTripper آخر.

بالنسبة إلى ناقل منشأ بشكل منفصل، راجع إعداد HTTP/2 فيه، لا سيما عند تمرير خطافات dial أو TLS مخصصة. يكشف Go عن ForceAttemptHTTP2، وفي الإصدارات الأحدث، إعداد Protocols الصريح لتلك الخيارات.

ما زال على الوجهة أن تقدم HTTP/2 عبر تفاوض TLS. افحص قيمة Proto أو ProtoMajor في الاستجابة الناجحة لترى ما استُخدم. فنجاح طلب HTTPS عبر SOCKS لا يثبت بحد ذاته أن البروتوكول المتفاوض عليه كان HTTP/2.

مقالات ذات صلة