Resolución de nomes SOCKS5 no cliente HTTP de Go
Por que socks5 e socks5h non seleccionan modos DNS diferentes no transporte HTTP estándar de Go.
No transporte HTTP estándar de Go 1.27.3, socks5 e socks5h tratan igual os nomes de destino. Un destino con nome de host envíase ao proxy como nome de host. Cambiar estes esquemas non alterna entre DNS local e remoto como en 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)
}
Substitúe o enderezo de documentación polo teu punto de acceso SOCKS5; podes buscar candidatos na lista de proxys SOCKS5. O exemplo usa o transporte propio de net/http; outra biblioteca Go pode ter un comportamento diferente.
Aínda cómpre distinguir dous nomes. Un enderezo numérico do proxy non require buscar o seu host; un proxy indicado por nome debe atoparse localmente antes de enviar unha petición SOCKS. Un destino numérico non ten nome que resolver e non demostra o tratamento dos nomes de host. Para inspeccionar a elección SOCKS real, comproba se o campo de destino leva un nome ou un enderezo.
O transporte estándar admite os esquemas de proxy http, https, socks5 e socks5h. Unha etiqueta xenérica SOCKS non demostra soporte de SOCKS5 no punto de acceso. O exemplo envía HTTP sobre TCP e non proba outras ordes SOCKS nin a retransmisión UDP.