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, primjerice kandidatom s popisa 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 izravno?

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 istodobnosti. Vlastiti transport čini rutu dijelom konfiguracije ovog klijenta.

http.ProxyURL vraća odabirnik koji uvijek bira predani URL. Razlikuje se od zadanog odabirnika okruženja koji uzima u obzir proxy varijable i pravila zaobilaženja. Ako želite testirati jedan određeni unos s HTTP popisa, izričit odabirnik uklanja taj izvor nejasnoće.

Zatvorite odgovor i ponovno koristite klijent

Primjer čita cijelo tijelo odgovora i zatvara ga. Čitanje do kraja pomaže transportu ponovno 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 utičnice nego i životni ciklus zahtjeva, uključujući čitanje tijela odgovora. Pogreške čitanja i dalje treba obraditi nakon povratka Get. Status poput 403 nije pogreška transporta Goa, pa provjeravajte StatusCode odvojeno od err.

Povezani članci