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 से अलग जाँचें।

संबंधित लेख