Překlad názvů SOCKS5 v HTTP klientu Go
Proč socks5 a socks5h nevybírají různé režimy DNS ve standardním HTTP transportu Go.
Ve standardním HTTP transportu Go 1.27.3 zpracovávají socks5 a socks5h názvy cílů stejně. Cíl zadaný názvem hostitele je proxy odeslán jako název hostitele. Přepnutí těchto schémat nepřepíná místní a vzdálené DNS jako v 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)
}
Nahraďte dokumentační adresu svým SOCKS5 endpointem; kandidáty můžete najít v seznamu SOCKS5 proxy. Příklad používá vlastní transport net/http; jiná knihovna Go může mít odlišné chování.
Stále je potřeba odlišit dva názvy. Číselná adresa proxy nevyžaduje vyhledání jejího hostitele; proxy určená názvem se musí najít místně před odesláním požadavku SOCKS. Číselný cíl nemá název k překladu a nemůže doložit práci s názvy hostitelů. Skutečnou volbu SOCKS ověříte kontrolou, zda pole cíle obsahuje název nebo adresu.
Standardní transport podporuje schémata proxy http, https, socks5 a socks5h. Obecné označení SOCKS nedokazuje podporu SOCKS5 na endpointu. Tento příklad posílá HTTP přes TCP a netestuje jiné příkazy SOCKS ani přenos UDP.