O transporte do cliente HTTP de Go escolle o proxy. Clona o transporte estándar antes de cambialo para que os demais usuarios do cliente predeterminado conserven as rutas actuais.

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

O enderezo é un marcador de documentación. Substitúeo pola IP e o porto dun proxy HTTP real, como un candidato da lista de proxys HTTP. O exemplo só usa a biblioteca estándar de Go; esta petición mediante proxy HTTP non necesita un paquete SOCKS nin unha variable de contorno para todo o proceso.

Por que non cambiar DefaultTransport directamente?

O transporte predeterminado é compartido. Modificalo pode cambiar o comportamento de código que nunca pediu usar o teu proxy, e facelo mentres as peticións o usan introduce problemas de concorrencia evitables. Un transporte dedicado fai que a ruta forme parte da configuración deste cliente.

http.ProxyURL devolve un selector que sempre escolle o URL indicado. É distinto do selector de contorno predeterminado, que considera as variables de proxy e as regras de exclusión. Se queres probar unha entrada concreta da lista HTTP, o selector explícito elimina esta fonte de ambigüidade.

Pecha a resposta e reutiliza o cliente

O exemplo le todo o corpo da resposta e péchao. Lelo ata o final axuda o transporte a reutilizar a conexión cando é posible. Nun programa con varias peticións polo mesmo proxy, conserva o cliente e o transporte en vez de crear un par novo para cada petición.

O tempo límite do cliente non só cobre a apertura do socket: tamén limita o ciclo da petición, incluída a lectura do corpo da resposta. Os erros de lectura aínda deben tratarse despois de que Get retorne. Un estado como 403 non é un erro do transporte de Go, así que revisa StatusCode por separado de err.

Artigos relacionados