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.

Articoli correlati