Caratteri speciali nelle password dei proxy
Codifica separatamente utente e password del proxy affinché @, due punti, barre e # non danneggino l’URL.
Una password con @ o # può danneggiare un URL proxy costruito a mano anche se le credenziali sono corrette. Questi caratteri hanno già un significato nell’URL, quindi il client può interpretare parte della password come nome host o frammento.
Codifica separatamente i due campi delle credenziali
Questo esempio conserva i separatori strutturali dell’URL e codifica soltanto utente e password:
from urllib.parse import quote
username = "user@team"
password = "p:a/ss#?"
proxy_url = (
"http://"
+ quote(username, safe="")
+ ":"
+ quote(password, safe="")
+ "@203.0.113.10:8080"
)
Usa il tuo endpoint e le tue credenziali reali. L’indirizzo mostrato è un esempio di documentazione. L’argomento safe vuoto è importante: quote di solito non esegue l’escape della barra, ma una barra in questo campo deve essere codificata.
Non codificare l’intero URL del proxy. Codificare i separatori dello schema e la @ fra credenziali e host distrugge la struttura che volevi conservare. Evita anche di codificare una seconda volta una password già codificata.
Usa il risultato con Requests
import requests
response = requests.get(
"https://example.com/",
proxies={"http": proxy_url, "https": proxy_url},
timeout=(5, 15),
)
response.raise_for_status()
Se la richiesta continua a fallire, verifica se il proxy rifiuta l’accesso oppure se il client è fallito prima, durante l’analisi o la connessione. Una richiesta di autenticazione 407 e un URL non valido sono errori diversi.
HTTPX può tenere separata l’autenticazione
Un oggetto Proxy di HTTPX può ricevere endpoint e credenziali come argomenti separati:
import httpx
proxy = httpx.Proxy(
"http://203.0.113.10:8080",
auth=("user@team", "p:a/ss#?"),
)
with httpx.Client(proxy=proxy, trust_env=False, timeout=15) as client:
response = client.get("https://example.com/")
response.raise_for_status()
Questo evita di costruire da soli la parte userinfo. Non cifra le credenziali indipendentemente dalla connessione al proxy né sceglie un metodo di autenticazione supportato da tutti i servizi.
Se un elenco gratuito fornisce solo IP e porta, questo esempio non fornisce credenziali predefinite. Usa l’autenticazione solo quando il gestore offre realmente un account. Non inserire URL con credenziali nei log condivisi o nei file sorgente.