O seletor de proxy por ambiente do Go tem uma exceção integrada para localhost e destinos com IP de loopback. Esvaziar NO_PROXY não remove essa exceção. Isso pode fazer um teste local usar conexão direta enquanto uma requisição a um nome de host público usa o proxy como esperado.

A regra diz respeito ao destino da requisição. Ela não impede o uso de um listener de proxy cujo próprio endereço seja 127.0.0.1.

Inspecione o seletor sem enviar uma requisição

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

Se quiser observar a comparação com o ambiente, execute o programa com as variáveis de proxy definidas para o processo. Ele apenas avalia os seletores; não se conecta ao proxy de documentação nem a nenhum dos destinos.

A descoberta pelo ambiente e um seletor explícito seguem políticas diferentes

ProxyFromEnvironment considera o esquema do destino, as configurações do ambiente e as regras de desvio, incluindo o tratamento especial de loopback. ProxyURL retorna a URL de proxy fornecida para cada requisição passada àquele seletor.

Um transporte dedicado com ProxyURL explícito pode, portanto, enviar uma requisição a um destino local por um proxy. Isso só é útil quando o proxy consegue acessar legitimamente o destino solicitado. O localhost de um proxy remoto não é o localhost do seu notebook, portanto forçar a rota não gera automaticamente um teste de conectividade útil.

Verifique antes de o processo armazenar o ambiente em cache

A configuração de proxy por ambiente do net/http padrão é armazenada em cache após o primeiro uso. Alterar depois uma variável de ambiente dentro do mesmo programa em execução não é uma forma confiável de repetir um teste de configuração do zero. Inicie um novo processo com os valores desejados ou forneça um seletor explícito cujo comportamento você controle.

Esse comportamento de loopback se aplica ao seletor de proxy padrão do Go 1.27.3. Outras linguagens e clientes HTTP podem usar regras diferentes de roteamento para localhost.

Artigos relacionados