Het transport van een Go-HTTP-client kiest de proxy. Kloon het standaardtransport voordat je het wijzigt, zodat andere gebruikers van de standaardclient hun bestaande route behouden.

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

Het adres is een documentatievoorbeeld. Vervang het door de IP en poort van een echte HTTP-proxy, zoals een kandidaat uit de HTTP-proxylijst. Het voorbeeld gebruikt alleen Go’s standaardbibliotheek; voor dit HTTP-proxyverzoek is geen SOCKS-pakket of procesbrede omgevingsvariabele nodig.

Waarom DefaultTransport niet rechtstreeks wijzigen?

Het standaardtransport wordt gedeeld. Een wijziging kan code beïnvloeden die nooit om jouw proxy heeft gevraagd, en wijzigen terwijl verzoeken het gebruiken introduceert vermijdbare gelijktijdigheidsproblemen. Een eigen transport maakt de route onderdeel van de configuratie van deze client.

http.ProxyURL geeft een selector terug die steeds de opgegeven URL kiest. Dat verschilt van de standaard omgevingsselector, die rekening houdt met proxyvariabelen en uitzonderingsregels. Wil je één specifiek item uit de HTTP-lijst testen, dan neemt de expliciete selector deze bron van onduidelijkheid weg.

Sluit het antwoord en hergebruik de client

Het voorbeeld leest de antwoordbody helemaal uit en sluit die. Volledig uitlezen helpt het transport de verbinding waar mogelijk te hergebruiken. Bewaar bij meerdere verzoeken via dezelfde proxy de client en het transport in plaats van voor elk verzoek een nieuw paar te maken.

De time-out van de client begrenst niet alleen het openen van de socket, maar ook de levenscyclus van het verzoek, inclusief het lezen van de antwoordbody. Leesfouten moet je ook na terugkeer van Get afhandelen. Een status als 403 is geen Go-transportfout; controleer StatusCode dus los van err.

Gerelateerde artikelen