SOCKS5-vertsnamnoppslag i HTTP-klienten til Go
Kvifor socks5 og socks5h ikkje vel ulike DNS-modusar i standard-HTTP-transporten til Go.
I standard-HTTP-transporten i Go 1.27.3 handsamar socks5 og socks5h målnamn likt. Eit mål med vertsnamn vert sendt til proxyen som vertsnamn. Byte mellom desse skjemaa vekslar ikkje mellom lokal og ekstern DNS slik som i 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)
}
Byt ut dokumentasjonsadressa med ditt SOCKS5-endepunkt; kandidatar finst i lista over SOCKS5-proxyar. Dømet nyttar transporten til net/http sjølv; eit anna Go-bibliotek kan ha ei anna åtferd.
To namn må likevel skiljast. Ei numerisk proxyadresse krev ikkje oppslag av proxyverten; ein namngjeven proxy må finnast lokalt før ein SOCKS-førespurnad kan sendast. Eit numerisk mål har ikkje noko målnamn å slå opp og viser ikkje vertsnamnhandsaminga. For å sjå det faktiske SOCKS-valet, kontroller om målfeltet inneheld eit namn eller ei adresse.
Standardtransporten støttar proxyskjemaa http, https, socks5 og socks5h. Ein generell SOCKS-etikett slår ikkje fast SOCKS5-støtte på eit endepunkt. Dømet sender HTTP over TCP og testar korkje andre SOCKS-kommandoar eller UDP-vidaresending.