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.