Dla nagłówka definiowanego przez operatora proxy Requests udostępnia HTTPAdapter.proxy_headers jako punkt nadpisania:

from urllib.parse import urlsplit
import requests
from requests.adapters import HTTPAdapter

class TaggedProxy(HTTPAdapter):
    def proxy_headers(self, proxy):
        headers = super().proxy_headers(proxy)
        endpoint = urlsplit(proxy)
        if (endpoint.scheme == 'http'
                and endpoint.hostname == 'proxy.example'
                and endpoint.port == 8080):
            headers['X-Proxy-Account'] = 'department-a'
        return headers

with requests.Session() as session:
    adapter = TaggedProxy()
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    response = session.get(
        'https://service.example/data',
        proxies={'https': 'http://proxy.example:8080'},
        timeout=15,
    )

X-Proxy-Account to przykład pola rozumianego przez to konkretne proxy, a nie standardowy sposób uwierzytelniania wobec każdego pośrednika.

Zacznij od super().proxy_headers(proxy). Requests używa tej metody do generowania Proxy-Authorization, gdy adres URL zawiera konto Basic. Zastąpienie całego wyniku może utracić to zachowanie.

Adapter przekazuje te wartości do ProxyManager z urllib3. W tunelu HTTPS towarzyszą one CONNECT. Zwykłe mapowanie nagłówków żądania opisuje późniejsze żądanie do celu.

Menedżery proxy są buforowane według adresu URL proxy. Nie traktuj tego haka jako niebuforowanego wywołania zwrotnego na żądanie biznesowe dla wartości, która musi się zmieniać przy każdym wywołaniu. Wybierz własność transportu odpowiednio, gdy znacznik konta się zmienia.

Przy zwykłym przekazywaniu HTTP pola proxy nadal wymagają zamierzonej polityki zużycia pośrednika. To, że nagłówek jest specyficzny dla proxy w API klienta, nie gwarantuje poufności, jeśli proxy przekaże go dalej.

Powiązane artykuły