Java ProxySelector: অনুপস্থিত HTTP ও HTTPS পোর্ট স্বাভাবিক করা
একটি কাস্টম ProxySelector-এ গন্তব্য তুলনা করার আগে বাদ পড়া HTTP পোর্ট স্বাভাবিক করুন, এবং HTTP নিয়মগুলি র' সকেট নির্বাচন থেকে দূরে রাখুন।
একটি নিয়ম 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 স্কিম ব্যবহার করে। কেবল হোস্ট ও পোর্ট মিলে যাওয়ায় সেই কলব্যাক URL অনুরোধের জন্য উদ্দিষ্ট HTTP প্রক্সি ফেরত দিতে পারে না। অসমর্থিত স্কিমগুলিকে আগের সিলেক্টরে পাঠান, তার উপযুক্ত আচরণ সংরক্ষণ করে।
নিজের কাস্টম সিলেক্টর বসানোর আগে সেই আগের সিলেক্টরটি ধরে রাখুন। প্রতিস্থাপকের ভেতর থেকে বর্তমান ডিফল্ট খুঁজলে প্রতিস্থাপকটিকেই আবার ডাকতে পারে।
অসঙ্গতি নির্ণয় করার সময় স্কিম, হোস্ট, মূল পোর্ট এবং কার্যকর পোর্ট লগ করুন। JDK বাস্তবায়নগুলির মধ্যে একটি পর্যবেক্ষিত সংখ্যা বা কলব্যাকের ক্রমের উপর নির্ভর করবেন না। নীতিকে প্রতিটি প্রদত্ত URI-র জন্য সঠিক সিদ্ধান্ত নিতে হবে।