Go HTTP client တွင် SOCKS5 host အမည် ဖြေရှင်းခြင်း
Go ၏ စံ HTTP transport တွင် socks5 နှင့် socks5h က မတူညီသော DNS mode များကို ဘာကြောင့် မရွေးချယ်ကြောင်း နားလည်ပါ။
Go 1.27.3 ၏ စံ HTTP transport တွင် socks5 နှင့် socks5h သည် ဦးတည်ရာအမည်များကို တူညီစွာ ကိုင်တွယ်သည်။ host အမည်ဖြင့် သတ်မှတ်ထားသော ပစ်မှတ်ကို proxy ထံ host အမည်အဖြစ်ပင် ပေးပို့သည်။ ထို scheme များကို ပြောင်းခြင်းက 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 endpoint ဖြင့် အစားထိုးပါ။ ဖြစ်နိုင်သော ရွေးချယ်စရာများကို SOCKS5 proxy စာရင်း တွင် ကြည့်နိုင်သည်။ ဥပမာသည် net/http ၏ ကိုယ်ပိုင် transport ကို သုံးထားသည်။ အခြား Go library တစ်ခု၏ လုပ်ဆောင်ပုံက ကွာခြားနိုင်သည်။
အမည်နှစ်ခုကို ခွဲခြားရန် လိုသေးသည်။ ကိန်းဂဏန်းဖြင့် ပေးထားသော proxy လိပ်စာတွင် proxy host အမည်ကို ရှာဖွေရန် မလိုပါ။ အမည်ဖြင့် သတ်မှတ်ထားသော proxy ကိုမူ SOCKS request မပို့မီ စက်တွင်း၌ ရှာတွေ့ရမည်။ ကိန်းဂဏန်းဖြင့် ပေးထားသော ဦးတည်ရာတွင် ဖြေရှင်းရမည့် ပစ်မှတ်အမည် မရှိသဖြင့် host အမည် ကိုင်တွယ်ပုံကို မဖော်ပြနိုင်ပါ။ SOCKS ၏ အမှန်တကယ် ရွေးချယ်မှုကို စစ်ဆေးရန် ဦးတည်ရာ field တွင် အမည်ပါသလား၊ လိပ်စာပါသလား ကြည့်ပါ။
စံ transport သည် http၊ https၊ socks5 နှင့် socks5h proxy scheme များကို ပံ့ပိုးသည်။ ယေဘုယျ SOCKS အညွှန်းတစ်ခုက endpoint တွင် SOCKS5 ပံ့ပိုးမှုရှိကြောင်း အတည်မပြုပါ။ ဤဥပမာသည် TCP ပေါ်မှ HTTP ကို ပေးပို့ပြီး အခြား SOCKS command များကိုဖြစ်စေ UDP relay ကိုဖြစ်စေ မစမ်းသပ်ပါ။