הגדרת כותרות פרוקסי עם 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 כאשר הכתובת מספקת חשבון Basic. החלפה של כל התוצאה עלולה לאבד את ההתנהגות הזו.
המתאם מעביר את הערכים אל ProxyManager של urllib3. במנהרת HTTPS הם מלווים את CONNECT. מיפוי כותרות הבקשה הרגיל מתאר את הבקשה המאוחרת אל היעד.
מנהלי פרוקסי נשמרים במטמון לפי כתובת הפרוקסי. אל תתייחסו לקרס הזה כאל קריאה חוזרת ללא מטמון לכל בקשת עסק עבור ערך שחייב להשתנות בכל קריאה. בחרו בבעלות על התעבורה בהתאם כאשר סימן החשבון משתנה.
בהעברת HTTP פשוטה, שדות פרוקסי עדיין זקוקים למדיניות הצריכה המיועדת של המתווך. היות כותרת ספציפית לפרוקסי ב-API של הלקוח אינה ערובה לסודיות אם הפרוקסי מעביר אותה הלאה.