Java ProxySelector: normalizar los puertos HTTP y HTTPS ausentes
Normaliza los puertos HTTP omitidos antes de comparar destinos en un ProxySelector personalizado y mantén las reglas HTTP fuera de la selección de sockets sin procesar.
Una regla envía http://reports.example:80/ a través de un proxy pero deja que http://reports.example/ vaya directo. Esas URL describen el mismo punto de conexión HTTP ordinario. La discrepancia suele venir de comparar literalmente sus puertos analizados.
URI.getPort() devuelve -1 cuando no aparece ningún puerto en la URI. No sustituye el valor predeterminado del esquema. Una política de enrutamiento que compare el valor con 80 pasará por alto la 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 la misma normalización a ambos lados de la comparación. Corregir solo la URI de la solicitud deja un destino configurado con un puerto omitido sin coincidencia. Compara el host, el puerto efectivo y el esquema previsto; rechaza los destinos mal formados o sin host mediante una ruta de error definida.
No conviertas cada callback en una decisión HTTP
También se puede consultar un selector predeterminado para conexiones de sockets sin procesar, con el esquema socket. Una coincidencia de host y puerto por sí sola no debe hacer que ese callback devuelva un proxy HTTP destinado a solicitudes URL. Delega los esquemas no admitidos al selector anterior, preservando su comportamiento adecuado.
Captura ese selector anterior antes de instalar el tuyo. Buscar el valor predeterminado actual desde dentro del sustituto puede simplemente volver a llamar al sustituto.
Registra el esquema, el host, el puerto original y el puerto efectivo al diagnosticar una discrepancia. No dependas de un solo número observado ni del orden de las llamadas entre implementaciones del JDK. La política debe tomar una decisión correcta para cada URI proporcionada.