Resolução de nomes SOCKS5 no cliente HTTP do Go
Entenda por que socks5 e socks5h não selecionam modos DNS diferentes no transporte HTTP padrão do Go.
No transporte HTTP padrão do Go 1.27.3, socks5 e socks5h tratam os nomes de destino da mesma forma. Um destino com nome de host é enviado ao proxy como nome de host. Trocar esses esquemas não alterna entre DNS local e remoto como no 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)
}
Substitua o endereço de documentação pelo seu endpoint SOCKS5; há candidatos na lista de proxies SOCKS5. O exemplo usa o transporte do próprio net/http; outra biblioteca Go pode implementar comportamento diferente.
Ainda há dois nomes a distinguir. Um endereço numérico de proxy dispensa consulta do host do proxy; um proxy indicado por nome precisa ser encontrado localmente antes do envio de uma requisição SOCKS. Um destino numérico não tem nome a resolver e não demonstra o tratamento de nomes de host. Para inspecionar a escolha SOCKS real, veja se o campo de destino contém nome ou endereço.
O transporte padrão aceita os esquemas de proxy http, https, socks5 e socks5h. Um rótulo genérico SOCKS não comprova suporte a SOCKS5 no endpoint. Este exemplo envia HTTP sobre TCP e não testa outros comandos SOCKS nem retransmissão UDP.