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 റിലേയോ പരിശോധിക്കുന്നില്ല.