Razrješavanje imena preko SOCKS5 u Go HTTP klijentu
Zašto socks5 i socks5h ne biraju različite DNS režime u standardnom HTTP transportu jezika Go.
U standardnom HTTP transportu jezika Go 1.27.3, socks5 i socks5h obrađuju imena odredišta na isti način. Odredište zadano imenom hosta šalje se proxyju kao ime hosta. Promjena tih shema ne prebacuje između lokalnog i udaljenog DNS-a kao u curlu.
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)
}
Zamijenite adresu za dokumentaciju svojom SOCKS5 krajnjom tačkom; kandidate možete potražiti na listi SOCKS5 proxyja. Primjer koristi transport samog paketa net/http; druga Go biblioteka može se ponašati drugačije.
I dalje treba razlikovati dva imena. Numerička adresa proxyja ne zahtijeva razrješavanje imena njegovog hosta; proxy zadan imenom mora se pronaći lokalno prije slanja SOCKS zahtjeva. Numeričko odredište nema ime za razrješavanje i ne može pokazati obradu imena hosta. Da biste provjerili stvarni izbor u SOCKS-u, pogledajte sadrži li polje odredišta ime ili adresu.
Standardni transport podržava proxy sheme http, https, socks5 i socks5h. Opća oznaka SOCKS ne dokazuje da krajnja tačka podržava SOCKS5. Ovaj primjer šalje HTTP preko TCP-a i ne ispituje druge SOCKS naredbe ni UDP prosljeđivanje.