Развязванне імёнаў SOCKS5 у HTTP-кліенце Go
Чаму socks5 і socks5h не выбіраюць розныя рэжымы DNS у стандартным HTTP-транспарце Go.
У стандартным 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.