Saját proxy egy Go HTTP-kliensnek
Klónozd a Go alapértelmezett transportját, állítsd be a ProxyURL-t a választott proxy-IP-re, és ne módosítsd más kliensek proxyhasználatát.
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.