Java ProxySelector: жетіспейтін HTTP және HTTPS порттарын қалыпқа келтіру
Жеке ProxySelector ішінде тағайындалуларды салыстырмас бұрын түсіріп қалған HTTP порттарын қалыпқа келтіріңіз және HTTP ережелерін шикі сокет таңдауынан тыс ұстаңыз.
Ереже http://reports.example:80/ адресін прокси арқылы жібереді, бірақ http://reports.example/ адресіне тікелей өтуге рұқсат береді. Бұл URL-дар бірдей қарапайым HTTP соңғы нүктесін сипаттайды. Сәйкессіздік әдетте талданған порттарды сөзбе-сөз салыстырудан туындайды.
URI.getPort() URI ішінде порт болмаған кезде -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-ын түзету порты түсірілген конфигурацияланған тағайындалуды сәйкессіз күйде қалдырады. Хостты, әсерлі портты және көзделген схеманы салыстырыңыз; дұрыс емес немесе хостсыз тағайындалуларды анықталған қате жолы арқылы қабылдамаңыз.
Әрбір callback-ты HTTP шешіміне айналдырмаңыз
Әдепкі селекторға шикі сокет қосылыстары үшін де socket схемасымен жүгінуге болады. Тек хост пен порттың сәйкесуі сол callback-тың URL сұраныстарына арналған HTTP проксиін қайтаруына себеп болмауы керек. Қолдау көрсетілмейтін схемаларды алдыңғы селекторға беріңіз, оның тиісті әрекетін сақтаңыз.
Сол алдыңғы селекторды өзіңіздікін орнатпас бұрын есте сақтаңыз. Ауыстырғыштың ішінен ағымдағы әдепкіні іздеу ауыстырғышты қайта шақыруы мүмкін.
Сәйкессіздікті диагностикалау кезінде схеманы, хостты, бастапқы портты және әсерлі портты тіркеңіз. JDK іске асырулары арасында байқалған бір санға немесе callback ретіне сенбеңіз. Саясат әрбір берілген URI үшін дұрыс шешім қабылдауы керек.