urllib3 ProxyManager: отправка данных Basic в proxy_headers
Передавайте данные прокси Basic через ProxyManager.proxy_headers, чтобы они были доступны во время HTTPS CONNECT и не становились заголовками назначения.
У ProxyManager есть отдельный аргумент proxy_headers для заголовков, отправляемых посреднику. Для прокси, принимающего аутентификацию Basic:
import urllib3
proxy_headers = urllib3.make_headers(
proxy_basic_auth=f'{proxy_user}:{proxy_password}'
)
with urllib3.ProxyManager(
'http://proxy.example:8080',
proxy_headers=proxy_headers,
timeout=urllib3.Timeout(connect=5, read=10),
) as http:
response = http.request('GET', 'https://service.example/data')
print(response.status)
Для обычного HTTP-назначения эти заголовки идут вместе с переданным запросом к прокси. Для HTTPS-назначения через CONNECT они относятся к настройке туннеля, а не к каждому зашифрованному запросу к сайту.
Обычный аргумент headers описывает заголовки запроса к назначению. Эта аутентификация прокси принадлежит другому получателю. Размещение учётной записи прокси там не равнозначно настройке предыдущего обмена CONNECT.
make_headers формирует значение заголовка Basic. Он не согласует NTLM, не выбирает поддерживаемую схему автоматически и не доказывает, что прокси принимает эту учётную запись.
Прокси с TLS-слушателем добавляет отдельный контекст TLS прокси. Адрес http:// выше намеренно описывает обычный HTTP-слушатель, передающий HTTPS-назначение через туннель.