Một đường hầm SOCKS mang một kết nối TCP. Go có thể thực hiện TLS với đích qua đường hầm đó và thương lượng HTTP/2 ở đó; bản thân máy chủ SOCKS không cần nói HTTP/2.

Trong một chương trình giữ lại transport mặc định chuẩn của Go, hãy sao chép cấu hình của nó và chọn proxy:

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,
}

Proxy và đích vẫn là hai giá trị khác nhau. Chọn một điểm cuối SOCKS5 từ danh sách proxy SOCKS5 cho giá trị proxy; HTTP/2 vẫn được thương lượng với đích. Dùng client để yêu cầu URL dịch vụ HTTPS thật, sau đó đóng phần thân phản hồi theo vòng đời thông thường của ứng dụng.

Transport mặc định chuẩn hỗ trợ HTTP/2. Sao chép nó giữ nguyên cấu hình đó đồng thời cho phép thay đổi lựa chọn proxy. Kiểm tra kiểu giả định rằng chương trình chưa thay thế http.DefaultTransport bằng một RoundTripper khác.

Với một transport được xây dựng riêng, hãy xem lại cấu hình HTTP/2 của nó, đặc biệt khi cung cấp hook dial hoặc TLS tùy chỉnh. Go công bố ForceAttemptHTTP2 và, trong các bản phát hành mới hơn, cấu hình Protocols rõ ràng cho những lựa chọn đó.

Đích vẫn phải cung cấp HTTP/2 thông qua thương lượng TLS. Kiểm tra giá trị Proto hoặc ProtoMajor của phản hồi thành công để xem điều gì đã được dùng. Một yêu cầu HTTPS thành công qua SOCKS tự nó không chứng minh rằng giao thức được thương lượng là HTTP/2.

Bài viết liên quan