A Go HTTP-kliensének transportja választja ki a proxyt. Módosítás előtt klónozd a szabványos transportot, hogy az alapértelmezett kliens többi használója megtarthassa a korábbi útvonalát.

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

A cím dokumentációs helykitöltő. Cseréld le egy valódi HTTP-proxy IP-címére és portjára, például a HTTP-proxylistából választott jelöltre. A példa csak a Go szabványos könyvtárát használja; ehhez a HTTP-proxykéréshez nem kell SOCKS-csomag vagy a teljes folyamatra ható környezeti változó.

Miért ne módosítsd közvetlenül a DefaultTransportot?

Az alapértelmezett transport megosztott. Módosítása olyan kód viselkedését is megváltoztathatja, amely sosem kérte a proxyd használatát. A kérések futása közbeni módosítás ráadásul elkerülhető párhuzamossági problémákat okoz. Saját transporttal az útvonal ennek a kliensnek a beállítása lesz.

A http.ProxyURL olyan választót ad vissza, amely mindig a megadott URL-t választja. Ez eltér az alapértelmezett környezeti választótól, amely figyelembe veszi a proxyváltozókat és a megkerülési szabályokat. Ha a HTTP-lista egy konkrét elemét akarod tesztelni, a kifejezett választó kizárja ezt a bizonytalanságot.

Zárd le a választ, és használd újra a klienst

A példa végigolvassa, majd lezárja a válasz törzsét. A teljes kiolvasás segít a transportnak újrahasználni a kapcsolatot, ha lehetséges. Ha a program több kérést küld ugyanazon a proxyn keresztül, tartsd meg a klienst és a transportot ahelyett, hogy minden kéréshez új párt készítenél.

A kliens időkorlátja nem csak a socket megnyitására vonatkozik: a kérés életciklusát is korlátozza, beleértve a válasz törzsének olvasását. Az olvasási hibákat a Get visszatérése után is kezelni kell. A 403-hoz hasonló állapot nem Go-transporthiba, ezért a StatusCode értékét a err értékétől külön vizsgáld.

Kapcsolódó cikkek