Trong transport HTTP chuẩn của Go 1.27.3, socks5 và socks5h xử lý tên đích giống nhau. Đích được chỉ định bằng tên máy chủ sẽ được gửi đến proxy dưới dạng tên máy chủ. Đổi giữa hai scheme này không chuyển giữa DNS cục bộ và từ xa như trong curl.

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/url"
    "time"
)

func main() {
    proxyURL, err := url.Parse("socks5://203.0.113.10:1080")
    if err != nil {
        log.Fatal(err)
    }

    transport := http.DefaultTransport.(*http.Transport).Clone()
    transport.Proxy = http.ProxyURL(proxyURL)
    defer transport.CloseIdleConnections()

    client := &http.Client{
        Transport: transport,
        Timeout: 15 * time.Second,
    }
    response, err := client.Get("https://example.com/")
    if err != nil {
        log.Fatal(err)
    }
    defer response.Body.Close()
    fmt.Println(response.StatusCode)
}

Thay địa chỉ dành cho tài liệu bằng điểm cuối SOCKS5 của bạn; có thể duyệt các lựa chọn trong danh sách proxy SOCKS5. Ví dụ dùng transport của chính net/http; thư viện Go khác có thể triển khai hành vi khác.

Vẫn cần phân biệt hai tên. Địa chỉ proxy dạng số không cần tra cứu tên máy chủ proxy; proxy được chỉ định bằng tên phải được tìm cục bộ trước khi có thể gửi yêu cầu SOCKS. Đích dạng số không có tên đích cần phân giải nên không thể minh họa cách xử lý tên máy chủ. Để kiểm tra lựa chọn thực tế của SOCKS, hãy xem trường đích chứa tên hay địa chỉ.

Transport chuẩn hỗ trợ các scheme proxy http, https, socks5 và socks5h. Nhãn SOCKS chung không chứng minh điểm cuối hỗ trợ SOCKS5. Ví dụ này gửi HTTP qua TCP và không kiểm tra các lệnh SOCKS khác hay chuyển tiếp UDP.

Bài viết liên quan