Java ProxySelector: normalizácia chýbajúcich portov HTTP a HTTPS
Normalizujte vynechané porty HTTP pred porovnávaním cieľov vo vlastnom ProxySelectore a držte pravidlá HTTP mimo výberu surových socketov.
Pravidlo odosiela http://reports.example:80/ cez proxy, ale http://reports.example/ necháva ísť priamo. Tieto URL opisujú ten istý bežný koncový bod HTTP. Nezhoda zvyčajne vzniká doslovným porovnaním parsovaných portov.
URI.getPort() vráti -1, keď v URI nie je žiadny port. Nenahrádza predvolenú hodnotu podľa schémy. Smerovacia politika, ktorá hodnotu porovnáva s 80, druhú URL minie.
String scheme = uri.getScheme();
int port = uri.getPort();
if (port == -1) {
if ("http".equalsIgnoreCase(scheme)) port = 80;
else if ("https".equalsIgnoreCase(scheme)) port = 443;
}
Použite rovnakú normalizáciu na obe strany porovnania. Oprava iba URI požiadavky stále necháva nakonfigurovaný cieľ s vynechaným portom bez zhody. Porovnávajte hostiteľa, efektívny port a zamýšľanú schému; odmietnite poškodené ciele alebo ciele bez hostiteľa definovanou chybovou cestou.
Nepremieňajte každé volanie na rozhodnutie o HTTP
Predvolený selektor možno konzultovať aj pre pripojenia surových socketov, so schémou socket. Samotná zhoda hostiteľa a portu nesmie spôsobiť, že toto volanie vráti proxy HTTP určenú pre URL požiadavky. Nepodporované schémy odovzdajte predchádzajúcemu selektoru a zachovajte jeho vhodné správanie.
Zachyťte tento predchádzajúci selektor skôr, než nainštalujete svoj. Zisťovanie aktuálnej predvolenej hodnoty zvnútra náhrady môže jednoducho znova zavolať náhradu.
Pri diagnostike nezhody zaznamenajte schému, hostiteľa, pôvodný port a efektívny port. Nespoliehajte sa na jedno pozorované číslo ani poradie volaní naprieč implementáciami JDK. Politika má pre každé dodané URI rozhodnúť správne.