برای سرآیندی که اپراتور پروکسی تعیین می‌کند، 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 استفاده می‌کند وقتی نشانی یک حساب Basic می‌دهد. جایگزینی کل نتیجه می‌تواند این رفتار را از دست بدهد.

آداپتور این مقادیر را به ProxyManager در urllib3 می‌فرستد. در تونل HTTPS همراه CONNECT می‌روند. نگاشت معمول سرآیندهای درخواست، درخواست بعدی به مقصد را توصیف می‌کند.

مدیرهای پروکسی بر اساس نشانی پروکسی در حافظه نهان نگه داشته می‌شوند. این قلاب را به‌عنوان فراخوان بدون حافظه نهان برای هر درخواست کاری برای مقداری که باید در هر فراخوانی تغییر کند در نظر نگیرید. وقتی نشانگر حساب متغیر است، مالکیت انتقال را بر همین اساس انتخاب کنید.

در ارسال ساده HTTP، فیلدهای پروکسی هنوز به سیاست مصرف مورد نظر واسطه نیاز دارند. اختصاصی بودن سرآیند به پروکسی در API کلاینت تضمین محرمانگی نیست اگر پروکسی آن را جلوتر بفرستد.

مقالات مرتبط