Задаване на прокси заглавки с HTTPAdapter.proxy_headers в Requests
Разширяване на HTTPAdapter.proxy_headers за поле, определено от проксито, при запазване на съществуващото генериране на заглавка за прокси удостоверяване в Requests.
За заглавка, определена от оператора на проксито, Requests предоставя HTTPAdapter.proxy_headers като точка за замяна:
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 е пример за поле, което това конкретно прокси разбира, а не стандартен начин за удостоверяване пред всеки посредник.
Започнете със super().proxy_headers(proxy). Requests използва този метод, за да генерира Proxy-Authorization, когато URL адресът предоставя Basic акаунт. Замяната на целия резултат може да загуби това поведение.
Адаптерът предава тези стойности на ProxyManager на urllib3. При HTTPS тунел те придружават CONNECT. Обичайното съответствие на заглавки описва следващата заявка към дестинацията.
Прокси мениджърите се кешират по URL на проксито. Не третирайте тази кука като некеширано callback за всяка бизнес заявка за стойност, която трябва да се променя при всяко извикване. Изберете собственик на транспорта съответно, когато маркерът на акаунта се променя.
При обикновено HTTP препращане прокси полетата все още се нуждаят от предвидената политика за потребление на посредника. Това, че заглавката е специфична за проксито в клиентския API, не е гаранция за поверителност, ако проксито я препрати нататък.