Rozwiązywanie nazw SOCKS5 w kliencie HTTP Go
Dlaczego socks5 i socks5h nie wybierają różnych trybów DNS w standardowym transporcie HTTP Go.
W standardowym transporcie HTTP Go 1.27.3 schematy socks5 i socks5h obsługują nazwy celów tak samo. Cel z nazwą hosta jest przesyłany do proxy jako nazwa hosta. Zmiana tych schematów nie przełącza między lokalnym a zdalnym DNS tak jak w 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)
}
Zastąp adres dokumentacyjny swoim punktem SOCKS5; kandydatów można przeglądać na liście proxy SOCKS5. Przykład używa własnego transportu net/http; inna biblioteka Go może działać inaczej.
Nadal trzeba odróżnić dwie nazwy. Numeryczny adres proxy nie wymaga wyszukania jego hosta; proxy wskazane nazwą musi zostać znalezione lokalnie przed wysłaniem żądania SOCKS. Numeryczny cel nie ma nazwy do rozwiązania i nie pokazuje obsługi nazw hostów. Aby sprawdzić faktyczny wybór SOCKS, zobacz, czy pole celu zawiera nazwę, czy adres.
Standardowy transport obsługuje schematy proxy http, https, socks5 i socks5h. Ogólna etykieta SOCKS nie dowodzi obsługi SOCKS5 w punkcie końcowym. Ten przykład wysyła HTTP po TCP i nie testuje innych poleceń SOCKS ani przekazywania UDP.