Java ProxySelector: गुम HTTP और HTTPS पोर्ट का सामान्यीकरण
कस्टम ProxySelector में गंतव्यों की तुलना करने से पहले छोड़े गए HTTP पोर्ट का सामान्यीकरण करें, और HTTP नियमों को कच्चे socket चयन से बाहर रखें।
एक नियम http://reports.example:80/ को प्रॉक्सी से भेजता है पर http://reports.example/ को सीधे जाने देता है। ये दोनों URL एक ही सामान्य HTTP एंडपॉइंट का वर्णन करते हैं। असंगति सामान्यतः उनके पार्स किए गए पोर्ट की शाब्दिक तुलना से आती है।
जब URI में कोई पोर्ट नहीं होता तो URI.getPort() -1 लौटाता है। यह स्कीम के लिए डिफ़ॉल्ट को प्रतिस्थापित नहीं करता। मान की 80 से तुलना करने वाली रूटिंग नीति दूसरे URL को चूक जाएगी।
String scheme = uri.getScheme();
int port = uri.getPort();
if (port == -1) {
if ("http".equalsIgnoreCase(scheme)) port = 80;
else if ("https".equalsIgnoreCase(scheme)) port = 443;
}
तुलना के दोनों पक्षों पर वही सामान्यीकरण लागू करें। केवल अनुरोध URI ठीक करने से छोड़े गए पोर्ट वाला कॉन्फ़िगर किया गया गंतव्य अब भी बिना मेल का रहता है। होस्ट, प्रभावी पोर्ट और इच्छित स्कीम की तुलना करें; विकृत या होस्ट-रहित गंतव्यों को परिभाषित त्रुटि पथ से अस्वीकार करें।
हर कॉलबैक को HTTP निर्णय न बनाएं
डिफ़ॉल्ट चयनकर्ता से कच्चे socket कनेक्शनों के लिए भी socket स्कीम के साथ पूछा जा सकता है। केवल होस्ट और पोर्ट का मेल उस कॉलबैक को URL अनुरोधों के लिए इच्छित HTTP प्रॉक्सी लौटाने का कारण नहीं बनना चाहिए। असमर्थित स्कीमों को पिछले चयनकर्ता को सौंपें, उसका उपयुक्त व्यवहार बनाए रखें।
अपना कस्टम चयनकर्ता स्थापित करने से पहले उस पिछले चयनकर्ता को पकड़ लें। प्रतिस्थापन के अंदर से वर्तमान डिफ़ॉल्ट देखना सीधे प्रतिस्थापन को फिर से कॉल कर सकता है।
असंगति का निदान करते समय स्कीम, होस्ट, मूल पोर्ट और प्रभावी पोर्ट लॉग करें। JDK कार्यान्वयनों में किसी एक देखी गई संख्या या कॉलबैक क्रम पर निर्भर न रहें। नीति को हर दिए गए URI के लिए सही निर्णय लेना चाहिए।