Java ProxySelector: a hiányzó HTTP- és HTTPS-portok normalizálása
Normalizálja az elhagyott HTTP-portokat, mielőtt célokat hasonlít össze egy egyéni ProxySelectorban, és tartsa az HTTP-szabályokat a nyers socketek kiválasztásán kívül.
Egy szabály http://reports.example:80/-t proxyn keresztül küld, de http://reports.example/-t közvetlenül engedi. Ezek az URL-ek ugyanazt a hétköznapi HTTP-végpontot írják le. Az eltérés általában abból ered, hogy a feldolgozott portokat szó szerint hasonlítják össze.
A URI.getPort() -1-t ad vissza, ha az URI-ban nincs port. Nem helyettesíti a séma alapértelmezett értékét. Egy útválasztási szabályzat, amely az értéket 80-hoz hasonlítja, kihagyja a második URL-t.
String scheme = uri.getScheme();
int port = uri.getPort();
if (port == -1) {
if ("http".equalsIgnoreCase(scheme)) port = 80;
else if ("https".equalsIgnoreCase(scheme)) port = 443;
}
Ugyanezt a normalizálást alkalmazza az összehasonlítás mindkét oldalára. Ha csak a kérelem URI-ját javítja, a kihagyott porttal rendelkező beállított cél továbbra is illeszkedés nélkül marad. Hasonlítsa össze a gazdagépet, a tényleges portot és a szándékolt sémát; a hibás vagy gazdagép nélküli célokat egy meghatározott hibapályán keresztül utasítsa el.
Ne alakítson minden visszahívást HTTP-döntéssé
Az alapértelmezett választót nyers socketkapcsolatokhoz is meg lehet kérdezni, a socket sémával. Önmagában a gazdagép és a port egyezése nem okozhatja, hogy ez a visszahívás URL-kérésekhez szánt HTTP-proxyt adjon vissza. Adja át a nem támogatott sémákat az előző választónak, megőrizve annak megfelelő viselkedését.
Rögzítse azt az előző választót, mielőtt telepíti a sajátját. Az aktuális alapértelmezett keresése a helyettesítő belsejéből egyszerűen újra meghívhatja a helyettesítőt.
Az eltérés diagnosztizálásakor naplózza a sémát, a gazdagépet, az eredeti portot és a tényleges portot. Ne hagyatkozzon egyetlen megfigyelt számra vagy a visszahívások sorrendjére a JDK-implementációk között. A szabályzatnak minden megadott URI-ra helyes döntést kell hoznia.