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થી અલગ તપાસો.

સંબંધિત લેખો