Go HTTP کلائنٹ کا transport پراکسی چنتا ہے۔ معیاری transport کو بدلنے سے پہلے کلون کریں تاکہ ڈیفالٹ کلائنٹ کے دوسرے صارفین کی موجودہ روٹنگ برقرار رہے۔

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "net/url"
    "time"
)

func main() {
    proxyURL, err := url.Parse("http://203.0.113.10:8080")
    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)
    if _, err := io.Copy(io.Discard, response.Body); err != nil {
        log.Fatal(err)
    }
}

پتہ دستاویزات کی مثال ہے۔ اسے کسی حقیقی HTTP پراکسی کے IP اور پورٹ سے بدلیں، مثلاً HTTP پراکسی فہرست سے منتخب کردہ امیدوار سے۔ مثال صرف Go کی معیاری لائبریری استعمال کرتی ہے؛ اس HTTP پراکسی درخواست کے لیے SOCKS پیکیج یا پورے پراسیس کا ماحولیاتی متغیر درکار نہیں۔

DefaultTransport کو براہ راست کیوں نہ بدلیں؟

ڈیفالٹ transport مشترک ہوتا ہے۔ اسے بدلنے سے ایسے کوڈ کا رویہ بھی بدل سکتا ہے جس نے آپ کی پراکسی مانگی ہی نہ ہو۔ درخواستوں کے استعمال کے دوران اسے بدلنا غیر ضروری ہم وقتی مسائل بھی پیدا کرتا ہے۔ الگ transport راستے کو اسی کلائنٹ کی ترتیب کا حصہ بناتا ہے۔

http.ProxyURL ایسا سلیکٹر لوٹاتا ہے جو ہمیشہ دیا گیا URL چنتا ہے۔ یہ ڈیفالٹ ماحولیاتی سلیکٹر سے مختلف ہے جو پراکسی متغیرات اور بائی پاس قواعد دیکھتا ہے۔ اگر مقصد HTTP فہرست کے ایک خاص اندراج کو جانچنا ہے تو واضح سلیکٹر ابہام کا یہ ذریعہ ختم کرتا ہے۔

جواب بند کریں اور کلائنٹ دوبارہ استعمال کریں

مثال جواب کی باڈی مکمل پڑھ کر بند کرتی ہے۔ آخر تک پڑھنا transport کو ممکن ہونے پر کنکشن دوبارہ استعمال کرنے میں مدد دیتا ہے۔ ایک ہی پراکسی سے متعدد درخواستیں کرنے والے پروگرام میں ہر بار نیا جوڑا بنانے کے بجائے کلائنٹ اور transport برقرار رکھیں۔

کلائنٹ کی مہلت صرف ساکٹ کھولنے کو نہیں بلکہ جواب کی باڈی پڑھنے سمیت درخواست کے پورے دورانیے کو محدود کرتی ہے۔ Get لوٹنے کے بعد بھی پڑھنے کی خرابیوں کو سنبھالنا ضروری ہے۔ 403 جیسا اسٹیٹس Go transport کی خرابی نہیں، اس لیے StatusCode کو err سے الگ جانچیں۔

متعلقہ مضامین