Go HTTP క్లయింట్లో SOCKS5 హోస్ట్పేరు పరిష్కారం
Go ప్రామాణిక HTTP ట్రాన్స్పోర్ట్లో socks5, socks5h వేర్వేరు DNS మోడ్లను ఎందుకు ఎంచుకోవో తెలుసుకోండి.
Go 1.27.3 ప్రామాణిక HTTP ట్రాన్స్పోర్ట్లో socks5, socks5h గమ్యస్థాన పేర్లను ఒకే విధంగా నిర్వహిస్తాయి. హోస్ట్పేరుతో ఇచ్చిన లక్ష్యాన్ని ప్రాక్సీకి హోస్ట్పేరుగానే పంపుతాయి. ఈ స్కీమ్లను మార్చడం వల్ల curl లోలాగా స్థానిక, దూరస్థ DNS మధ్య మార్పు జరగదు.
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 మద్దతును నిర్ధారించదు. ఈ ఉదాహరణ TCP ద్వారా HTTP పంపుతుంది; ఇతర SOCKS ఆదేశాలను గానీ UDP రిలేను గానీ పరీక్షించదు.