Для запроса Basic от HTTP-прокси используйте ProxyBasicAuthHandler. Этот обычный пример HTTP хранит маршрут и учётную запись в одном 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)

Используйте реальную конечную точку и учётную запись, выданную оператором. Обработчик использует менеджер паролей для запроса прокси; сопоставьте нужные URI и realm прокси. Базовая аутентификация на стороне назначения использует другой обработчик.

Прямой вызов opener сохраняет эту настройку локальной. URL запроса остаётся сайтом, а не посредником. Этот открытый маршрут HTTP не шифрует обмен Basic.

Не делайте из этого примера вывода о поддержке туннеля HTTPS. 407 во время CONNECT возникает на этапе настройки, до обычного ответа назначения; выбранная интеграция должна обрабатывать аутентификацию там. Замена обработчика входа на сайте не исправит тот более ранний запрос.

URL прокси с учётными данными — другой формат, встречающийся в старых примерах. Если вы его используете, корректно кодируйте разделители URL и держите получившийся URL с секретом вне журналов.

Похожие статьи