Pour un défi Basic émis par un proxy HTTP, utilisez ProxyBasicAuthHandler. Cet exemple HTTP ordinaire conserve la route et le compte dans un seul opener :

import os
from urllib.request import (
    ProxyHandler, ProxyBasicAuthHandler,
    HTTPPasswordMgrWithDefaultRealm, build_opener,
)

proxy_url = 'http://proxy.example:8080'
passwords = HTTPPasswordMgrWithDefaultRealm()
passwords.add_password(
    None, proxy_url,
    os.environ['PROXY_USER'], os.environ['PROXY_PASSWORD'],
)
opener = build_opener(
    ProxyHandler({'http': proxy_url}),
    ProxyBasicAuthHandler(passwords),
)
with opener.open('http://example.com/', timeout=10) as response:
    print(response.status)

Utilisez le point de terminaison réel et le compte fourni par l'opérateur. Le gestionnaire s'appuie sur le gestionnaire de mots de passe pour le défi du proxy ; faites correspondre l'URI et le realm prévus du proxy. L'authentification Basic côté destination utilise un autre gestionnaire.

Appeler l'opener directement garde cette configuration locale. L'URL de la requête reste le site web, pas l'intermédiaire. Cette route HTTP en clair ne chiffre pas un échange Basic.

Ne déduisez pas de cet exemple une prise en charge du tunnel HTTPS. Un 407 pendant CONNECT survient à la configuration, avant une réponse ordinaire de la destination ; l'intégration retenue doit y gérer l'authentification. Changer le gestionnaire de connexion du site ne peut pas réparer ce défi antérieur.

Les URL de proxy porteuses d'identifiants sont un autre format que l'on trouve dans des exemples plus anciens. Si vous les utilisez, encodez correctement les délimiteurs d'URL et gardez l'URL résultante porteuse de secret hors des journaux.

Articles similaires