De ce Go ocolește proxy-ul pentru localhost
Deosebește excepția loopback integrată în Go de NO_PROXY și compară rutarea prin mediu cu un ProxyURL explicit.
Selectorul de proxy din mediul de execuție al Go are o excepție integrată pentru localhost și destinațiile cu IP loopback. Golirea NO_PROXY nu elimină această excepție. Astfel, un test local poate merge direct, în timp ce o cerere către un nume de gazdă public folosește proxy-ul conform așteptărilor.
Regula privește destinația cererii. Nu împiedică folosirea unui listener proxy a cărui adresă proprie este 127.0.0.1.
Inspectează selectorul fără să trimiți o cerere
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)
}
}
Dacă vrei să observi comparația cu mediul, rulează programul cu variabilele proxy setate pentru proces. Programul doar evaluează selectorii; nu se conectează la proxy-ul din documentație sau la vreuna dintre destinații.
Descoperirea din mediu și un selector explicit sunt politici diferite
ProxyFromEnvironment ține cont de schema destinației, setările mediului și regulile de ocolire, inclusiv de tratarea specială a loopback. ProxyURL întoarce URL-ul proxy furnizat pentru fiecare cerere transmisă acelui selector.
Prin urmare, un transport dedicat cu ProxyURL explicit poate trimite o cerere către o destinație locală prin proxy. Acest lucru este util numai dacă proxy-ul poate ajunge în mod legitim la destinația cerută. localhost al unui proxy la distanță nu este localhost al laptopului tău, deci forțarea rutei nu este automat un test util de conectivitate.
Verifică înainte ca procesul să memoreze mediul în cache
Configurația de proxy din mediu a net/http standard este memorată în cache după prima utilizare. Schimbarea ulterioară a unei variabile de mediu în același program în execuție nu este o metodă sigură de a repeta un test cu o configurație nouă. Pornește un proces nou cu valorile dorite sau furnizează un selector explicit al cărui comportament îl controlezi.
Acest comportament loopback se aplică selectorului de proxy standard din Go 1.27.3. Alte limbaje și clienți HTTP pot folosi reguli diferite de rutare pentru localhost.