Java ProxySelector: нормализиране на липсващи HTTP и HTTPS портове
Нормализирайте пропуснатите HTTP портове, преди да сравнявате дестинации в персонализиран ProxySelector, и дръжте HTTP правилата извън избора на сурови сокети.
Правило изпраща http://reports.example:80/ през прокси, но оставя http://reports.example/ да мине директно. Тези URL адреси описват една и съща обикновена HTTP крайна точка. Несъответствието обикновено идва от буквалното сравняване на разчетените портове.
URI.getPort() връща -1, когато в URI няма порт. Той не замества стойността по подразбиране за схемата. Политика за маршрутизиране, която сравнява стойността с 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. Само съвпадение на хост и порт не бива да кара това извикване да връща HTTP прокси, предназначено за URL заявки. Предавайте неподдържаните схеми на предишния селектор, запазвайки подходящото му поведение.
Запазете този предишен селектор, преди да инсталирате своя. Търсенето на текущата стойност по подразбиране отвътре в замяната може просто да извика замяната отново.
Записвайте схемата, хоста, оригиналния порт и ефективния порт, когато диагностицирате несъответствие. Не разчитайте на едно наблюдавано число или ред на извикванията при различните реализации на JDK. Политиката трябва да взема правилно решение за всеки подаден URI.