SOCKS5 hostinimede lahendamine Go HTTP-kliendis
Miks socks5 ja socks5h ei vali Go standardses HTTP-transpordis eri DNS-režiime.
Go 1.27.3 standardses HTTP-transpordis käsitlevad socks5 ja socks5h sihtkoha nimesid ühtemoodi. Hostinimega sihtkoht saadetakse puhverserverile hostinimena. Nende skeemide vahetamine ei lülita kohaliku ja kaug-DNS-i vahel nagu curl-is.
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)
}
Asenda dokumentatsiooninäite aadress oma SOCKS5-lõpp-punktiga; kandidaate saab vaadata SOCKS5-puhverserverite loendist. Näide kasutab net/http enda transporti; teine Go teek võib toimida teisiti.
Kahte nime tuleb siiski eristada. Arvuline puhverserveri aadress ei vaja selle hosti otsingut; nimega puhverserver tuleb enne SOCKS-päringu saatmist kohalikult leida. Arvulisel sihtkohal pole lahendatavat nime ja see ei näita hostinime käsitlemist. Tegeliku SOCKS-valiku uurimiseks vaata, kas sihtkoha väli kannab nime või aadressi.
Standardtransport toetab puhverserveriskeeme http, https, socks5 ja socks5h. Üldine SOCKS-silt ei tõesta lõpp-punkti SOCKS5-tuge. See näide saadab HTTP-d TCP kaudu ega testi teisi SOCKS-käske või UDP-edastust.