Proxy vyberá transport HTTP klienta v Go. Pred zmenou štandardný transport naklonujte, aby si ostatní používatelia predvoleného klienta zachovali svoje doterajšie smerovanie.

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)
    }
}

Adresa je dokumentačný zástupný údaj. Nahraďte ju skutočnou IP adresou a portom HTTP proxy, napríklad kandidátom zo zoznamu HTTP proxy. Príklad používa len štandardnú knižnicu Go; táto požiadavka cez HTTP proxy nepotrebuje balík SOCKS ani premennú prostredia pre celý proces.

Prečo nemeniť DefaultTransport priamo?

Predvolený transport je zdieľaný. Jeho zmena môže ovplyvniť kód, ktorý nikdy nežiadal používať vašu proxy. Zmeny počas jeho používania požiadavkami navyše vytvárajú zbytočné problémy súbehu. Vlastný transport robí trasu súčasťou konfigurácie tohto klienta.

http.ProxyURL vracia selektor, ktorý vždy zvolí zadanú URL. Líši sa od predvoleného selektora prostredia, ktorý zohľadňuje premenné proxy a pravidlá obchádzania. Ak chcete otestovať jednu konkrétnu položku zoznamu HTTP, explicitný selektor odstráni tento zdroj nejasností.

Zatvorte odpoveď a klienta používajte opakovane

Príklad prečíta celé telo odpovede a zatvorí ho. Čítanie do konca pomáha transportu opätovne použiť spojenie, ak je to možné. V programe s viacerými požiadavkami cez rovnakú proxy ponechajte klienta a transport namiesto vytvárania novej dvojice pre každú požiadavku.

Časový limit klienta pokrýva nielen otvorenie socketu, ale aj životný cyklus požiadavky vrátane čítania tela odpovede. Chyby čítania treba stále spracovať po návrate Get. Stav ako 403 nie je chybou transportu Go, preto kontrolujte StatusCode oddelene od err.

Súvisiace články