د 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 جلا وګورئ.

اړوندې مقالې