Le sélecteur de proxy fondé sur l’environnement de Go comporte une exception intégrée pour localhost et les adresses IP de bouclage. Vider NO_PROXY ne supprime pas cette exception. Un test local peut donc passer en direct alors qu’une requête vers un nom d’hôte public utilise le proxy comme prévu.

Cette règle concerne la destination de la requête. Elle ne vous empêche pas d’utiliser un point d’écoute de proxy dont l’adresse est elle-même 127.0.0.1.

Examiner le sélecteur sans envoyer de requête

package main

import (
    "fmt"
    "net/http"
    "net/url"
)

func main() {
    fixed, _ := url.Parse("http://203.0.113.10:8080")
    for _, target := range []string{
        "http://localhost:8000/",
        "http://127.0.0.1:8000/",
        "http://example.com/",
    } {
        request, _ := http.NewRequest("GET", target, nil)
        discovered, err := http.ProxyFromEnvironment(request)
        explicit, _ := http.ProxyURL(fixed)(request)
        fmt.Println(target, discovered, explicit, err)
    }
}

Pour observer la comparaison avec l’environnement, lancez le programme avec les variables de proxy définies pour le processus. Il évalue uniquement les sélecteurs ; il ne se connecte ni au proxy d’exemple ni à aucune des destinations.

La découverte par l’environnement et un sélecteur explicite suivent des politiques différentes

ProxyFromEnvironment tient compte du schéma de destination, des paramètres d’environnement et des règles de contournement, y compris du traitement particulier du bouclage. ProxyURL renvoie l’URL de proxy fournie pour chaque requête transmise à ce sélecteur.

Un transport dédié avec un ProxyURL explicite peut donc envoyer une requête vers une destination locale par un proxy. Cela n’est utile que si le proxy peut légitimement atteindre la destination demandée. Le localhost d’un proxy distant n’est pas celui de votre portable ; forcer ce trajet ne constitue donc pas automatiquement un test de connectivité pertinent.

Vérifier avant que le processus mette son environnement en cache

La configuration de proxy par l’environnement du net/http standard est mise en cache après sa première utilisation. Modifier ensuite une variable d’environnement dans le même programme en cours d’exécution n’est pas une méthode fiable pour refaire un test avec une nouvelle configuration. Démarrez un nouveau processus avec les valeurs voulues ou fournissez un sélecteur explicite dont vous maîtrisez le comportement.

Ce comportement de bouclage s’applique au sélecteur de proxy standard de Go 1.27.3. D’autres langages et clients HTTP peuvent appliquer des règles différentes pour localhost.

Articles similaires