Java ProxySelector: normaliser manglande HTTP- og HTTPS-portar
Normaliser utelatne HTTP-portar før du samanliknar destinasjonar i ein eigen ProxySelector, og hald HTTP-reglar utanfor valet av rå sockets.
Ein regel sender http://reports.example:80/ gjennom ein proxy, men lèt http://reports.example/ gå direkte. Desse URL-ane skildrar det same vanlege HTTP-endepunktet. Avviket kjem vanlegvis av at dei parsane portane blir samanlikna bokstaveleg.
URI.getPort() returnerer -1 når det ikkje står nokon port i URI-en. Han erstattar ikkje standardverdien for skjemaet. Ein rutepolitikk som samanliknar verdien med 80, vil oversjå den andre URL-en.
String scheme = uri.getScheme();
int port = uri.getPort();
if (port == -1) {
if ("http".equalsIgnoreCase(scheme)) port = 80;
else if ("https".equalsIgnoreCase(scheme)) port = 443;
}
Bruk den same normaliseringa på begge sider av samanlikninga. Retter du berre URI-en i førespurnaden, står ein konfigurert destinasjon med utelaten port framleis utan treff. Samanlikn vert, effektiv port og tiltenkt skjema; avvis feilforma eller vertlause destinasjonar gjennom ein definert feilveg.
Ikkje gjer kvar tilbakekalling til ei HTTP-avgjerd
Ein standardveljar kan òg bli spurd for rå socket-tilkoplingar, med skjemaet socket. Eit verts- og porttreff åleine skal ikkje få den tilbakekallinga til å returnere ein HTTP-proxy meint for URL-førespurnader. Send ikkje-støtta skjema vidare til den førre veljaren, og ta vare på den høvelege åtferda hans.
Ta vare på den førre veljaren før du installerer din eigen. Å slå opp gjeldande standard innanfrå erstattaren kan rett og slett kalle erstattaren igjen.
Logg skjema, vert, opphavleg port og effektiv port når du diagnostiserer eit avvik. Ikkje stol på eitt observd tal eller rekkjefølgja av tilbakekallingar på tvers av JDK-implementasjonar. Politikken bør ta ei korrekt avgjerd for kvar oppgjeven URI.