El transport del client HTTP de Go tria el proxy. Clona el transport estàndard abans de canviar-lo perquè els altres usuaris del client predeterminat conservin les rutes actuals.

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

L’adreça és un marcador de documentació. Substitueix-la per la IP i el port d’un proxy HTTP real, com ara un candidat de la llista de proxys HTTP. L’exemple només fa servir la biblioteca estàndard de Go; aquesta petició mitjançant proxy HTTP no necessita un paquet SOCKS ni una variable d’entorn per a tot el procés.

Per què no canviar DefaultTransport directament?

El transport predeterminat és compartit. Modificar-lo pot canviar el comportament de codi que mai no ha demanat fer servir el teu proxy, i fer-ho mentre hi ha peticions que l’utilitzen introdueix problemes de concurrència evitables. Un transport dedicat fa que la ruta formi part de la configuració d’aquest client.

http.ProxyURL retorna un selector que sempre tria l’URL indicat. Es diferencia del selector d’entorn predeterminat, que considera les variables de proxy i les regles d’exclusió. Si vols provar una entrada concreta de la llista HTTP, el selector explícit elimina aquesta font d’ambigüitat.

Tanca la resposta i reutilitza el client

L’exemple llegeix tot el cos de la resposta i el tanca. Llegir-lo fins al final ajuda el transport a reutilitzar la connexió quan és possible. En un programa amb diverses peticions pel mateix proxy, conserva el client i el transport en lloc de crear una parella nova per a cada petició.

El temps límit del client no només cobreix l’obertura del sòcol: també limita el cicle de la petició, inclosa la lectura del cos de resposta. Cal gestionar els errors de lectura després que Get retorni. Un estat com 403 no és un error del transport de Go; comprova StatusCode per separat de err.

Articles relacionats