func dialViaSOCKS(ctx context.Context, destination string) (net.Conn, error) {
    dialer, err := proxy.SOCKS5(
        "tcp",
        "127.0.0.1:1080",
        nil,
        &net.Dialer{Timeout: 5 * time.Second},
    )
    if err != nil {
        return nil, err
    }
    contextDialer, ok := dialer.(proxy.ContextDialer)
    if !ok {
        return nil, errors.New("SOCKS dialer lacks context support")
    }
    return contextDialer.DialContext(ctx, "tcp", destination)
}

ရှိပြီးသား Go ကွန်ရက် ပက်ကေ့ဂျ်အတွင်း context, errors, net, time နှင့် x/net/proxy တင်သွင်းမှုများကို အသုံးပြုပါ။ nil အငြင်းအခုံသည် SOCKS အထောက်အထား မည်သည့်ကိုမျှ မရွေးချယ်ပါ။ ခွင့်ပြုထားသော အများပြည်သူ ပရောက်စီ လမ်းကြောင်းပေါ်ရှိ အများပြည်သူ ဦးတည်ရာတစ်ခုအတွက် SOCKS5 ပရောက်စီ စာရင်းသည် dialer ၏ အဆုံးမှတ်အတွက် ကိုယ်စားလှယ်လောင်းများကို ပေးသည်။

ထုတ်ယူထားသော proxy.ContextDialer ကြေညာချက်သည် ပံ့ပိုးမထားသော အကောင်အထည်ဖော်မှုများကို ရှင်းလင်းစွာ မအောင်မြင်စေပါ။ အတွင်းပိုင်း dialer အမျိုးအစားကို အမည်ပေးခြင်း သို့မဟုတ် ခေါ်ဆိုသူ မစီမံနိုင်သော ပိတ်ဆို့သည့် goroutine စတင်ခြင်းအစား ဖြန့်ကျက်ထားသော မှီခိုမှုကို စစ်ဆေးပါ။

context သည် ချိတ်ဆက်မှု တည်ဆောက်ခြင်းကို ထိန်းချုပ်သည်။ net.Conn ပြန်လည်ပေးပြီးနောက် သင့်လျော်သော ဖတ်/ရေး သို့မဟုတ် ပိုမြင့်သော အဆင့် တောင်းဆိုမှု သတ်မှတ်ချိန်များကို ကျင့်သုံးပါ။ အခြေခံ dialer ၏ ချိတ်ဆက်မှု အချိန်ကုန်ဆုံးချက်နှင့် အက်ပလီကေးရှင်း၏ စုစုပေါင်း ဘတ်ဂျက်သည် မတူညီသော ကန့်သတ်ချက်များ ဖြစ်သည်။

HTTP သယ်ယူပို့ဆောင်ရေး ပေါင်းစပ်မှုအတွက် ၎င်း၏ ပုံမှန် TLS နှင့် HTTP အပြုအမူကို ထိန်းသိမ်းပါ။ ပြန်လည်ပေးသော context သိသော SOCKS စီးကြောင်းသည် သယ်ယူပို့ဆောင်ရေးသို့ လွှဲအပ်ခြင်း ဖြစ်ပြီး တုံ့ပြန်မှု မဟုတ်ဘဲ နောက်ပိုင်း byte အားလုံးအတွက် သက်တမ်း မူဝါဒလည်း မဟုတ်ပါ။

ဆက်စပ်ဆောင်းပါးများ