SOCKS5-värdnamnsuppslag i Gos HTTP-klient
Varför socks5 och socks5h inte väljer olika DNS-lägen i Gos standard-HTTP-transport.
I standard-HTTP-transporten i Go 1.27.3 behandlar socks5 och socks5h destinationsnamn lika. Ett mål med värdnamn skickas till proxyn som värdnamn. Byte mellan dessa scheman växlar inte mellan lokal och fjärr-DNS 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)
}
Ersätt dokumentationsadressen med din SOCKS5-ändpunkt; kandidater finns i listan med SOCKS5-proxyer. Exemplet använder net/http:s egen transport; ett annat Go-bibliotek kan ha annat beteende.
Två namn måste ändå skiljas åt. En numerisk proxyadress kräver inget uppslag av proxyvärden; en namngiven proxy måste hittas lokalt innan en SOCKS-förfrågan kan skickas. En numerisk destination har inget målnamn att slå upp och visar inte värdnamnshanteringen. För det faktiska SOCKS-valet, kontrollera om destinationsfältet innehåller ett namn eller en adress.
Standardtransporten stöder proxyschemana http, https, socks5 och socks5h. En allmän SOCKS-etikett fastställer inte SOCKS5-stöd på en ändpunkt. Exemplet skickar HTTP över TCP och testar varken andra SOCKS-kommandon eller UDP-vidarebefordran.