Der Transport eines Go-HTTP-Clients wählt den Proxy aus. Klonen Sie den Standardtransport vor der Änderung, damit andere Nutzer des Standardclients ihre bisherige Route behalten.

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)
    }
}

Die Adresse ist ein Dokumentationsplatzhalter. Ersetzen Sie sie durch IP und Port eines echten HTTP-Proxys, etwa einen Kandidaten aus der HTTP-Proxy-Liste. Das Beispiel verwendet nur Gos Standardbibliothek; für diese HTTP-Proxy-Anfrage ist weder ein SOCKS-Paket noch eine prozessweite Umgebungsvariable nötig.

Warum nicht DefaultTransport direkt ändern?

Der Standardtransport wird gemeinsam genutzt. Eine Änderung kann Code beeinflussen, der nie Ihren Proxy verwenden sollte. Zudem schafft das Ändern eines Transports während laufender Anfragen vermeidbare Nebenläufigkeitsprobleme. Ein eigener Transport macht die Route zum Bestandteil der Konfiguration dieses Clients.

http.ProxyURL liefert einen Selektor, der stets die angegebene URL wählt. Anders der standardmäßige Umgebungsselektor: Er berücksichtigt Proxyvariablen und Umgehungsregeln. Wenn Sie einen bestimmten HTTP-Listeneintrag testen möchten, beseitigt der explizite Selektor diese Mehrdeutigkeit.

Antwort schließen und Client wiederverwenden

Das Beispiel liest den Antwortkörper vollständig und schließt ihn. Vollständiges Lesen hilft dem Transport, eine Verbindung wiederzuverwenden, wenn dies möglich ist. Behalten Sie bei mehreren Anfragen über denselben Proxy Client und Transport, statt für jede Anfrage ein neues Paar anzulegen.

Das Client-Timeout begrenzt nicht nur das Öffnen des Sockets, sondern auch den Lebenszyklus der Anfrage einschließlich des Lesens des Antwortkörpers. Lesefehler müssen auch nach der Rückkehr von Get behandelt werden. Ein Status wie 403 ist kein Go-Transportfehler; prüfen Sie StatusCode daher getrennt von err.

Ähnliche Artikel