Proksi bira transport HTTP klijenta u Gou. Prije promjene klonirajte standardni transport kako bi ostali korisnici podrazumijevanog 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 proksija, recimo kandidatom sa liste HTTP proksija. Primjer koristi samo standardnu biblioteku Goa; za ovaj zahtjev preko HTTP proksija nisu potrebni paket SOCKS ni promjenljiva okruženja za cijeli proces.

Zašto ne promijeniti DefaultTransport direktno?

Podrazumijevani transport je dijeljen. Promjena može utjecati na kod koji nikad nije tražio vaš proksi, 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 proslijeđeni URL. Razlikuje se od podrazumijevanog selektora okruženja koji uzima u obzir proksi promjenljive i pravila zaobilaženja. Ako želite testirati jedan određeni unos sa 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 da ponovo koristi vezu kad je moguće. U programu s više zahtjeva kroz isti proksi zadržite klijent i transport umjesto pravljenja 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 poslije povratka Get. Status poput 403 nije greška transporta Goa, pa provjeravajte StatusCode odvojeno od err.

Povezani članci