Разрешаване на имена при SOCKS5 в HTTP клиента на Go
Защо socks5 и socks5h не избират различни DNS режими в стандартния HTTP транспорт на Go.
В стандартния HTTP транспорт на Go 1.27.3 socks5 и socks5h обработват еднакво имената на целите. Цел с име на хост се изпраща до проксито като име. Смяната на тези схеми не превключва между локален и отдалечен DNS както в 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)
}
Заменете документационния адрес със своята SOCKS5 крайна точка; кандидати има в списъка със SOCKS5 проксита. Примерът използва собствения транспорт на net/http; друга Go библиотека може да работи различно.
Все пак трябва да различавате две имена. Числов адрес на прокси не изисква търсене на неговия хост; прокси с име трябва да бъде намерено локално преди изпращане на SOCKS заявка. Числова цел няма име за разрешаване и не може да демонстрира обработката на имена. За да проверите реалния избор на SOCKS, вижте дали полето за цел съдържа име или адрес.
Стандартният транспорт поддържа прокси схемите http, https, socks5 и socks5h. Общ етикет SOCKS не доказва SOCKS5 поддръжка на крайна точка. Примерът изпраща HTTP по TCP и не тества други SOCKS команди или UDP препредаване.