Dálle un proxy propio a un cliente HTTP de Go
Clona o transporte predeterminado de Go, configura ProxyURL para a IP escollida e evita cambiar o comportamento dos demais clientes.
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.