@- tai #-merkin sisältävä salasana voi rikkoa käsin rakennetun välityspalvelin-URL:n, vaikka tunnukset olisivat oikein. Merkeillä on jo merkitys URL:ssa, joten asiakas voi tulkita osan salasanasta palvelinnimeksi tai fragmentiksi.

Koodaa kaksi tunnustietokenttää erikseen

Tämä esimerkki säilyttää URL:n rakenteelliset erotinmerkit ja koodaa vain käyttäjänimen ja salasanan:

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

Käytä todellista päätepistettäsi ja tunnuksiasi. Näytetty osoite on dokumentaatioesimerkki. Tyhjä safe-argumentti on tärkeä: quote jättää tavallisesti vinoviivan suojaamatta, mutta tässä tunnustietokentässä vinoviiva pitää koodata.

Älä koodaa koko välityspalvelin-URL:ää. Skeeman erotinten sekä tunnusten ja palvelimen välisen @-merkin koodaaminen tuhoaa rakenteen, jonka halusit säilyttää. Älä myöskään koodaa jo koodattua salasanaa uudelleen.

Käytä tulosta Requestsin kanssa

import requests

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

Jos pyyntö yhä epäonnistuu, selvitä, torjuuko välityspalvelin kirjautumisen vai epäonnistuiko asiakas jo aiemmin jäsentäessään tai yhdistäessään. 407-todennushaaste ja virheellinen URL ovat eri virheitä.

HTTPX voi pitää todennuksen erillään

HTTPX:n Proxy-olio voi saada päätepisteen ja tunnukset erillisinä argumentteina:

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

Tällöin userinfo-osaa ei tarvitse rakentaa itse. Se ei salaa tunnuksia välityspalvelinyhteydestä riippumatta eikä valitse kaikkien palvelujen tukemaa todennusmenetelmää.

Jos ilmainen luettelo antaa vain IP:n ja portin, tämä esimerkki ei tarjoa oletustunnuksia. Käytä todennusta vain, kun ylläpitäjä todella antaa tilin. Älä tallenna tunnuksia sisältäviä URL-osoitteita jaettuihin lokeihin tai lähdetiedostoihin.

Aiheeseen liittyvät artikkelit