Java ProxySelector : normaliser les ports HTTP et HTTPS manquants
Normalisez les ports HTTP omis avant de comparer des destinations dans un ProxySelector personnalisé, et gardez les règles HTTP hors de la sélection des sockets brutes.
Une règle envoie http://reports.example:80/ via un proxy mais laisse http://reports.example/ passer en direct. Ces URL décrivent le même point de terminaison HTTP ordinaire. La divergence vient généralement d'une comparaison littérale de leurs ports analysés.
URI.getPort() renvoie -1 lorsqu'aucun port n'apparaît dans l'URI. Il ne remplace pas la valeur par défaut du schéma. Une politique de routage qui compare la valeur à 80 manquera la seconde 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;
}
Appliquez la même normalisation des deux côtés de la comparaison. Corriger uniquement l'URI de la requête laisse une destination configurée avec un port omis sans correspondance. Comparez l'hôte, le port effectif et le schéma prévu ; rejetez les destinations mal formées ou sans hôte via un chemin d'erreur défini.
Ne transformez pas chaque rappel en décision HTTP
Un sélecteur par défaut peut aussi être consulté pour des connexions par socket brute, avec le schéma socket. Une correspondance d'hôte et de port seule ne doit pas faire renvoyer à ce rappel un proxy HTTP destiné aux requêtes URL. Déléguez les schémas non pris en charge au sélecteur précédent en préservant son comportement approprié.
Capturez ce sélecteur précédent avant d'installer le vôtre. Rechercher la valeur par défaut actuelle depuis l'intérieur du remplacement peut simplement rappeler le remplacement.
Consignez le schéma, l'hôte, le port d'origine et le port effectif lors du diagnostic d'une divergence. Ne dépendez pas d'un seul nombre observé ni de l'ordre des rappels selon les implémentations du JDK. La politique doit prendre une décision correcte pour chaque URI fournie.