Java ProxySelector: fehlende HTTP- und HTTPS-Ports normalisieren
Normalisieren Sie ausgelassene HTTP-Ports, bevor Sie Ziele in einem benutzerdefinierten ProxySelector vergleichen, und halten Sie HTTP-Regeln aus der Auswahl roher Sockets heraus.
Eine Regel leitet http://reports.example:80/ über einen Proxy, lässt http://reports.example/ aber direkt durch. Diese URLs beschreiben denselben gewöhnlichen HTTP-Endpunkt. Die Abweichung entsteht meist daraus, dass ihre geparsten Ports wörtlich verglichen werden.
URI.getPort() gibt -1 zurück, wenn in der URI kein Port steht. Er ersetzt nicht den Standardwert des Schemas. Eine Routingrichtlinie, die den Wert mit 80 vergleicht, verfehlt die zweite 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;
}
Wenden Sie dieselbe Normalisierung auf beide Seiten des Vergleichs an. Nur die Anfrage-URI zu korrigieren lässt ein konfiguriertes Ziel mit ausgelassenem Port weiterhin ohne Treffer. Vergleichen Sie Host, effektiven Port und beabsichtigtes Schema; lehnen Sie fehlerhafte oder hostlose Ziele über einen definierten Fehlerpfad ab.
Machen Sie nicht jeden Callback zu einer HTTP-Entscheidung
Ein Standardselektor kann auch für rohe Socket-Verbindungen befragt werden, mit dem Schema socket. Eine bloße Host-und-Port-Übereinstimmung darf nicht dazu führen, dass dieser Callback einen HTTP-Proxy zurückgibt, der für URL-Anfragen gedacht ist. Geben Sie nicht unterstützte Schemata an den vorherigen Selektor weiter und erhalten Sie dessen passendes Verhalten.
Merken Sie sich diesen vorherigen Selektor, bevor Sie Ihren eigenen installieren. Den aktuellen Standard von innerhalb des Ersatzes nachzuschlagen, kann einfach den Ersatz erneut aufrufen.
Protokollieren Sie Schema, Host, ursprünglichen Port und effektiven Port, wenn Sie eine Abweichung diagnostizieren. Verlassen Sie sich nicht auf eine beobachtete Zahl oder Reihenfolge der Callbacks über JDK-Implementierungen hinweg. Die Richtlinie sollte für jede gelieferte URI eine korrekte Entscheidung treffen.