Java ProxySelector: normalizacija nedostajućih HTTP i HTTPS portova
Normalizirajte izostavljene HTTP portove prije uspoređivanja odredišta u prilagođenom ProxySelectoru i držite HTTP pravila izvan odabira sirovih socketa.
Pravilo šalje http://reports.example:80/ kroz proxy, ali pušta http://reports.example/ izravno. Ti URL-ovi opisuju istu običnu HTTP završnu točku. Nesklad obično dolazi iz doslovne usporedbe njihovih parsiranih portova.
URI.getPort() vraća -1 kada u URI-ju nema porta. Ne zamjenjuje zadanu vrijednost za shemu. Politika usmjeravanja koja vrijednost uspoređuje s 80 propustit će drugi 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;
}
Primijenite istu normalizaciju na obje strane usporedbe. Popravljanje samo URI-ja zahtjeva i dalje ostavlja konfigurirano odredište s izostavljenim portom bez podudaranja. Usporedite host, efektivni port i namjeravanu shemu; odbijte neispravna odredišta ili ona bez hosta kroz definirani put pogreške.
Ne pretvarajte svaki povratni poziv u HTTP odluku
Zadani selektor može se konzultirati i za veze sirovih socketa, koristeći shemu socket. Samo podudaranje hosta i porta ne smije uzrokovati da taj povratni poziv vrati HTTP proxy namijenjen URL zahtjevima. Prepustite nepodržane sheme prethodnom selektoru, čuvajući njegovo odgovarajuće ponašanje.
Zabilježite taj prethodni selektor prije instaliranja svoga. Traženje trenutnog zadanog iz unutrašnjosti zamjene može jednostavno ponovno pozvati zamjenu.
Zabilježite shemu, host, izvorni port i efektivni port kada dijagnosticirate nesklad. Ne oslanjajte se na jedan uočeni broj ili redoslijed povratnih poziva kroz implementacije JDK-a. Politika treba donijeti ispravnu odluku za svaki dostavljeni URI.