Vlastní proxy pro HTTP klienta v Go
Naklonujte výchozí transport Go, nastavte ProxyURL pro zvolenou IP proxy a neovlivňujte chování ostatních klientů.
Proxy vybírá transport HTTP klienta v Go. Před změnou standardní transport naklonujte, aby ostatní uživatelé výchozího klienta zachovali své dosavadní směrování.
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 ji skutečnou IP adresou a portem HTTP proxy, například kandidátem ze seznamu HTTP proxy. Příklad používá pouze standardní knihovnu Go; tento požadavek přes HTTP proxy nepotřebuje balíček SOCKS ani proměnnou prostředí pro celý proces.
Proč neměnit DefaultTransport přímo?
Výchozí transport je sdílený. Jeho změna může ovlivnit kód, který nikdy nepožadoval vaši proxy. Měnit transport během jeho používání požadavky navíc vytváří zbytečné problémy souběhu. Vlastní transport činí trasu součástí konfigurace tohoto klienta.
http.ProxyURL vrací selektor, který vždy zvolí předanou URL. To se liší od výchozího selektoru prostředí, který zohledňuje proměnné proxy a pravidla obcházení. Chcete-li otestovat jednu konkrétní položku seznamu HTTP, explicitní selektor odstraní tento zdroj nejasností.
Zavřete odpověď a znovu používejte klienta
Příklad přečte celé tělo odpovědi a zavře je. Čtení do konce pomáhá transportu znovu použít spojení, pokud je to možné. V programu s více požadavky přes stejnou proxy ponechte klienta a transport namísto vytváření nové dvojice pro každý požadavek.
Časový limit klienta pokrývá nejen otevření socketu, ale i životní cyklus požadavku včetně čtení těla odpovědi. Chyby čtení je stále nutné zpracovat po návratu Get. Stav jako 403 není chybou transportu Go, proto kontrolujte StatusCode odděleně od err.