Heslo obsahujúce @ alebo # môže poškodiť ručne zostavené URL proxy, aj keď sú prihlasovacie údaje správne. Tieto znaky už majú v URL význam, takže klient môže časť hesla vyhodnotiť ako názov hostiteľa alebo fragment.

Kódujte obe polia prihlasovacích údajov zvlášť

Tento príklad zachováva štrukturálne oddeľovače URL a kóduje iba používateľské meno a heslo:

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

Použite skutočný koncový bod a prihlasovacie údaje. Uvedená adresa je dokumentačný príklad. Prázdny argument safe je dôležitý: quote bežne ponecháva lomku neescapovanú, ale v tomto poli sa musí zakódovať.

Nekódujte celé URL proxy. Kódovanie oddeľovačov schémy a znaku @ medzi údajmi a hostiteľom zničí štruktúru, ktorú chcete zachovať. Vyhnite sa tiež opätovnému kódovaniu už zakódovaného hesla.

Použite výsledok s Requests

import requests

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy_url, "https": proxy_url},
    timeout=(5, 15),
)
response.raise_for_status()

Ak požiadavka stále zlyháva, zistite, či proxy odmieta prihlásenie, alebo klient zlyhal skôr pri parsovaní či pripájaní. Autentifikačná výzva 407 a neplatné URL sú rôzne chyby.

HTTPX môže ponechať autentifikáciu oddelenú

Objekt Proxy v HTTPX môže prijať koncový bod a prihlasovacie údaje ako samostatné argumenty:

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

Nemusíte tak sami zostavovať časť userinfo. Nešifruje to údaje nezávisle od spojenia s proxy ani nevyberá autentifikačnú metódu podporovanú každou službou.

Ak bezplatný zoznam ponúka iba IP a port, tento príklad neposkytuje predvolené prihlasovacie údaje. Autentifikáciu používajte len vtedy, keď prevádzkovateľ skutočne poskytuje účet. URL s prihlasovacími údajmi nepatria do zdieľaných logov ani zdrojových súborov.

Súvisiace články