Para um cabeçalho definido pelo operador do proxy, o Requests expõe HTTPAdapter.proxy_headers como ponto de substituição:

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 é um exemplo de campo entendido por este proxy específico, não uma forma padrão de autenticar em qualquer intermediário.

Comece com super().proxy_headers(proxy). O Requests usa esse método para gerar Proxy-Authorization quando a URL fornece uma conta Basic. Substituir todo o resultado pode perder esse comportamento.

O adaptador passa esses valores ao ProxyManager do urllib3. Num túnel HTTPS, eles acompanham o CONNECT. O mapeamento comum dos cabeçalhos de pedido descreve o pedido posterior ao destino.

Os gestores de proxy são armazenados em cache por URL de proxy. Não trate este gancho como um callback sem cache por pedido de negócio para um valor que precise mudar em cada chamada. Escolha a titularidade do transporte em conformidade quando o marcador de conta varia.

No encaminhamento HTTP simples, os campos de proxy ainda precisam da política de consumo pretendida pelo intermediário. Um cabeçalho ser específico do proxy na API de cliente não garante confidencialidade se o proxy o encaminhar.

Artigos relacionados