Vlastiti proxy za HTTP klijent u Gou
Klonirajte zadani transport Goa, postavite ProxyURL za odabrani IP i ne mijenjajte ponašanje ostalih klijenata.
Proxy bira transport HTTP klijenta u Gou. Prije promjene klonirajte standardni transport kako bi ostali korisnici zadanog klijenta zadržali postojeće rute.
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 dokumentacijski primjer. Zamijenite je stvarnim IP-om i portom HTTP proxyja, naprimjer kandidatom s liste HTTP proxyja. Primjer koristi samo standardnu biblioteku Goa; za ovaj zahtjev preko HTTP proxyja ne trebaju paket SOCKS ni varijabla okruženja za cijeli proces.
Zašto ne promijeniti DefaultTransport direktno?
Zadani transport je zajednički. Promjena može utjecati na kod koji nikad nije tražio vaš proxy, a promjene dok ga zahtjevi koriste stvaraju nepotrebne probleme konkurentnosti. Vlastiti transport čini rutu dijelom konfiguracije ovog klijenta.
http.ProxyURL vraća selektor koji uvijek bira predani URL. Razlikuje se od zadanog selektora okruženja koji uzima u obzir proxy varijable i pravila zaobilaženja. Ako želite testirati jedan određeni unos s HTTP liste, izričit selektor uklanja taj izvor nejasnoće.
Zatvorite odgovor i ponovo koristite klijent
Primjer čita cijelo tijelo odgovora i zatvara ga. Čitanje do kraja pomaže transportu ponovo koristiti vezu kad je to moguće. U programu s više zahtjeva kroz isti proxy zadržite klijent i transport umjesto stvaranja novog para za svaki zahtjev.
Vremensko ograničenje klijenta ne pokriva samo otvaranje socketa nego i životni ciklus zahtjeva, uključujući čitanje tijela odgovora. Greške čitanja i dalje treba obraditi nakon povratka Get. Status poput 403 nije greška transporta Goa, pa provjeravajte StatusCode odvojeno od err.