C’est le transport du client HTTP Go qui choisit le proxy. Clonez le transport standard avant de le modifier afin que les autres utilisateurs du client par défaut conservent leur routage.

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’adresse est réservée aux exemples de documentation. Remplacez-la par l’IP et le port d’un véritable proxy HTTP, par exemple un candidat de la liste de proxys HTTP. L’exemple utilise uniquement la bibliothèque standard de Go ; cette requête via un proxy HTTP ne nécessite ni paquet SOCKS ni variable d’environnement à l’échelle du processus.

Pourquoi ne pas modifier directement DefaultTransport ?

Le transport par défaut est partagé. Le modifier peut changer le comportement d’un code qui n’a jamais demandé à utiliser votre proxy. Le modifier pendant que des requêtes l’utilisent crée aussi des problèmes de concurrence évitables. Un transport dédié inscrit le routage dans la configuration de ce client.

http.ProxyURL renvoie un sélecteur qui choisit systématiquement l’URL fournie. Il diffère du sélecteur d’environnement par défaut, qui tient compte des variables de proxy et des règles de contournement. Si vous souhaitez tester une entrée précise de la liste HTTP, ce sélecteur explicite élimine cette source d’ambiguïté.

Fermer la réponse et réutiliser le client

L’exemple lit entièrement le corps de réponse, puis le ferme. Cette lecture complète aide le transport à réutiliser la connexion lorsque c’est possible. Pour plusieurs requêtes via le même proxy, conservez le client et le transport au lieu de recréer la paire à chaque requête.

Le délai du client ne couvre pas seulement l’ouverture du socket ; il borne aussi le cycle de la requête, y compris la lecture du corps de réponse. Les erreurs de lecture doivent encore être traitées après le retour de Get. Un statut comme 403 n’est pas une erreur du transport Go : examinez StatusCode séparément de err.

Articles similaires