सही क्रेडेंशियल होने पर भी @ या # वाला पासवर्ड हाथ से बनाए प्रॉक्सी URL को बिगाड़ सकता है। इन वर्णों का URL में पहले से अर्थ है, इसलिए क्लाइंट पासवर्ड के हिस्से को होस्टनाम या फ़्रैगमेंट मान सकता है।

दोनों क्रेडेंशियल फ़ील्ड अलग-अलग एनकोड करें

यह उदाहरण URL के संरचनात्मक विभाजक बनाए रखता है और केवल उपयोगकर्ता नाम तथा पासवर्ड एनकोड करता है:

from urllib.parse import quote

username = "user@team"
password = "p:a/ss#?"
proxy_url = (
    "http://"
    + quote(username, safe="")
    + ":"
    + quote(password, safe="")
    + "@203.0.113.10:8080"
)

अपना वास्तविक एंडपॉइंट और क्रेडेंशियल इस्तेमाल करें। दिखाया पता दस्तावेज़ का उदाहरण है। खाली safe आर्ग्युमेंट महत्त्वपूर्ण है: quote आम तौर पर स्लैश को बिना एस्केप छोड़े रखता है, लेकिन इस क्रेडेंशियल फ़ील्ड के अंदर स्लैश एनकोड होना चाहिए।

पूरा प्रॉक्सी URL एनकोड न करें। स्कीम के विभाजक और क्रेडेंशियल व होस्ट के बीच का @ एनकोड करने से वह संरचना बिगड़ती है जिसे आप बचाना चाहते थे। पहले से एनकोड किए पासवर्ड को दोबारा भी एनकोड न करें।

परिणाम को Requests के साथ इस्तेमाल करें

import requests

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy_url, "https": proxy_url},
    timeout=(5, 15),
)
response.raise_for_status()

अनुरोध फिर भी विफल हो तो जाँचें कि प्रॉक्सी लॉगिन ठुकरा रही है या क्लाइंट उससे पहले पार्सिंग या कनेक्शन में विफल हुआ। 407 प्रमाणीकरण चुनौती और अमान्य URL अलग विफलताएँ हैं।

HTTPX प्रमाणीकरण अलग रख सकता है

HTTPX का Proxy ऑब्जेक्ट एंडपॉइंट और क्रेडेंशियल अलग आर्ग्युमेंट में ले सकता है:

import httpx

proxy = httpx.Proxy(
    "http://203.0.113.10:8080",
    auth=("user@team", "p:a/ss#?"),
)

with httpx.Client(proxy=proxy, trust_env=False, timeout=15) as client:
    response = client.get("https://example.com/")
    response.raise_for_status()

इससे userinfo भाग खुद बनाने की जरूरत नहीं रहती। यह क्रेडेंशियल को प्रॉक्सी कनेक्शन से स्वतंत्र रूप से एन्क्रिप्ट नहीं करता और हर सेवा में समर्थित प्रमाणीकरण विधि भी नहीं चुनता।

मुफ़्त सूची केवल IP और पोर्ट दे तो यह उदाहरण डिफ़ॉल्ट क्रेडेंशियल का स्रोत नहीं है। प्रमाणीकरण तभी इस्तेमाल करें जब संचालक सचमुच खाता दे। क्रेडेंशियल वाले URL साझा लॉग और स्रोत फ़ाइलों में न रखें।

संबंधित लेख