Java ProxySelector: normaliser manglende HTTP- og HTTPS-porter
Normaliser utelatte HTTP-porter før du sammenligner destinasjoner i en tilpasset ProxySelector, og hold HTTP-regler utenfor valget av rå sockets.
En regel sender http://reports.example:80/ gjennom en proxy, men lar http://reports.example/ gå direkte. Disse URL-ene beskriver det samme vanlige HTTP-endepunktet. Avviket kommer vanligvis av at de parsede portene sammenlignes bokstavelig.
URI.getPort() returnerer -1 når det ikke står noen port i URI-en. Den erstatter ikke standardverdien for skjemaet. En rutingpolicy som sammenligner verdien med 80, vil overse 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 samme normaliseringen på begge sider av sammenligningen. Retter du bare URI-en i forespørselen, står en konfigurert destinasjon med utelatt port fortsatt uten treff. Sammenlign vert, effektiv port og tiltenkt skjema; avvis feilformede eller vertsløse destinasjoner gjennom en definert feilvei.
Ikke gjør hver tilbakekalling til en HTTP-avgjørelse
En standardvelger kan også spørres for rå socket-tilkoblinger, med skjemaet socket. Et verts- og porttreff alene skal ikke få den tilbakekallingen til å returnere en HTTP-proxy ment for URL-forespørsler. Send ikke-støttede skjemaer videre til den forrige velgeren, og bevar dens passende oppførsel.
Ta vare på den forrige velgeren før du installerer din egen. Å slå opp gjeldende standard innenfra erstatningen kan rett og slett kalle erstatningen igjen.
Logg skjema, vert, opprinnelig port og effektiv port når du diagnostiserer et avvik. Ikke stol på ett observert tall eller rekkefølgen av tilbakekallinger på tvers av JDK-implementasjoner. Policyen bør ta en korrekt avgjørelse for hver oppgitte URI.