یک تونل 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 بوده است.

مقالات مرتبط