Risoluzione dei nomi SOCKS5 nel client HTTP di Go
Perché socks5 e socks5h non selezionano modalità DNS diverse nel trasporto HTTP standard di Go.
Nel trasporto HTTP standard di Go 1.27.3, socks5 e socks5h gestiscono i nomi di destinazione allo stesso modo. Una destinazione con nome host viene inviata al proxy come nome host. Cambiare questi schemi non alterna DNS locale e remoto come avviene in 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)
}
Sostituisci l’indirizzo di documentazione con il tuo endpoint SOCKS5; puoi cercare candidati nell’elenco dei proxy SOCKS5. L’esempio usa il trasporto proprio di net/http; un’altra libreria Go può implementare comportamenti diversi.
Restano comunque due nomi da distinguere. Un indirizzo numerico del proxy non richiede una ricerca del suo host; un proxy indicato per nome deve essere trovato localmente prima di inviare una richiesta SOCKS. Una destinazione numerica non ha un nome da risolvere e non può dimostrare la gestione dei nomi host. Per esaminare la scelta SOCKS effettiva, controlla se il campo di destinazione contiene un nome o un indirizzo.
Il trasporto standard supporta gli schemi proxy http, https, socks5 e socks5h. Un’etichetta generica SOCKS non dimostra che l’endpoint supporti SOCKS5. Questo esempio invia HTTP su TCP e non prova altri comandi SOCKS né il relay UDP.