У стандартному HTTP-транспорті Go 1.27.3 socks5 та socks5h однаково обробляють імена призначення. Ціль, задана іменем хоста, надсилається проксі як ім’я хоста. Перемикання цих схем не змінює локальний DNS на віддалений і навпаки, як у 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)
}

Замініть адресу для документації своєю кінцевою точкою SOCKS5; кандидатів можна переглянути у списку SOCKS5-проксі. Приклад використовує власний транспорт net/http; інша бібліотека Go може поводитися інакше.

Утім, слід розрізняти два імені. Числова адреса проксі не потребує пошуку його хоста; проксі, заданий іменем, потрібно знайти локально, перш ніж надсилати запит SOCKS. Числова адреса призначення не має імені для розв’язання й не може продемонструвати обробку імен хостів. Щоб з’ясувати фактичний вибір у SOCKS, перевірте, чи містить поле призначення ім’я або адресу.

Стандартний транспорт підтримує схеми проксі http, https, socks5 та socks5h. Загальна позначка SOCKS не доводить підтримку SOCKS5 кінцевою точкою. Цей приклад надсилає HTTP через TCP й не перевіряє ані інших команд SOCKS, ані ретрансляції UDP.

Схожі статті