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 ریلے۔