Java ProxySelector: normalizar os portos HTTP e HTTPS que faltan
Normaliza os portos HTTP omitidos antes de comparar destinos nun ProxySelector personalizado e mantén as regras HTTP fóra da selección de sockets en bruto.
Unha regra envía http://reports.example:80/ a través dun proxy pero deixa http://reports.example/ ir directo. Esas URL describen o mesmo punto final HTTP ordinario. A discrepancia adoita vir de comparar literalmente os seus portos analizados.
URI.getPort() devolve -1 cando non aparece ningún porto na URI. Non substitúe o valor predeterminado do esquema. Unha política de enrutamento que compare o valor con 80 perderá a segunda 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;
}
Aplica a mesma normalización aos dous lados da comparación. Corrixir só a URI da solicitude deixa un destino configurado cun porto omitido sen coincidencia. Compara o host, o porto efectivo e o esquema previsto; rexeita os destinos mal formados ou sen host mediante unha ruta de erro definida.
Non convertas cada callback nunha decisión HTTP
Tamén se pode consultar un selector predeterminado para conexións de sockets en bruto, co esquema socket. Unha coincidencia só de host e porto non debe facer que ese callback devolva un proxy HTTP pensado para solicitudes URL. Delega os esquemas non admitidos ao selector anterior, preservando o seu comportamento axeitado.
Captura ese selector anterior antes de instalar o teu. Buscar o valor predeterminado actual desde dentro do substituto pode simplemente volver chamar o substituto.
Rexistra o esquema, o host, o porto orixinal e o porto efectivo cando diagnostiques unha discrepancia. Non dependas dun só número observado nin da orde das chamadas entre implementacións do JDK. A política debe tomar unha decisión correcta para cada URI proporcionada.