Разрешавање имена преко SOCKS5 у Go HTTP клијенту
Зашто 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 прослеђивање.