Requests-এর HTTPAdapter.proxy_headers দিয়ে প্রক্সি হেডার সেট করা
প্রক্সি-নির্ধারিত ফিল্ডের জন্য 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) দিয়ে শুরু করুন। URL কোনো Basic অ্যাকাউন্ট দিলে Requests ওই পদ্ধতি ব্যবহার করে Proxy-Authorization তৈরি করে। পুরো ফলাফল প্রতিস্থাপন করলে সেই আচরণ হারিয়ে যেতে পারে।
অ্যাডাপ্টার এই মানগুলো urllib3-এর ProxyManager-এ পাঠায়। HTTPS টানেলের ক্ষেত্রে সেগুলো CONNECT-এর সঙ্গে যায়। সাধারণ রিকোয়েস্ট হেডার ম্যাপিং পরবর্তী গন্তব্য-রিকোয়েস্ট বর্ণনা করে।
প্রক্সি ম্যানেজার প্রক্সি URL অনুযায়ী ক্যাশ করা হয়। প্রতিটি কলে বদলাতে হবে এমন মানের জন্য এই হুককে ক্যাশহীন প্রতি-ব্যবসায়িক-রিকোয়েস্ট কলব্যাক ভাববেন না। অ্যাকাউন্ট মার্কার বদলালে সেই অনুযায়ী ট্রান্সপোর্টের মালিকানা বেছে নিন।
সাধারণ HTTP ফরওয়ার্ডিংয়েও প্রক্সি ফিল্ডের জন্য মধ্যস্থের অভিপ্রেত ব্যবহার-নীতি দরকার। ক্লায়েন্ট API-তে হেডার প্রক্সি-নির্দিষ্ট হওয়া গোপনীয়তার নিশ্চয়তা নয়, যদি প্রক্সি সেটি আরও সামনে পাঠায়।