Java ProxySelector: normalizar as portas HTTP e HTTPS ausentes
Normalize as portas HTTP omitidas antes de comparar destinos num ProxySelector personalizado e mantenha as regras HTTP fora da seleção de sockets brutos.
Uma regra envia http://reports.example:80/ através de um proxy mas deixa http://reports.example/ ir diretamente. Esses URL descrevem o mesmo ponto final HTTP comum. A divergência geralmente vem de comparar literalmente as portas analisadas.
URI.getPort() retorna -1 quando nenhuma porta aparece no URI. Ele não substitui o padrão do esquema. Uma política de roteamento que compare o valor com 80 perderá o segundo 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;
}
Aplique a mesma normalização aos dois lados da comparação. Corrigir apenas o URI da requisição ainda deixa um destino configurado com porta omitida sem correspondência. Compare o host, a porta efetiva e o esquema pretendido; rejeite destinos malformados ou sem host por um caminho de erro definido.
Não transforme cada callback numa decisão HTTP
Um seletor padrão também pode ser consultado para conexões de sockets brutos, com o esquema socket. Uma correspondência apenas de host e porta não deve fazer esse callback devolver um proxy HTTP destinado a requisições URL. Delegue os esquemas não suportados ao seletor anterior, preservando o comportamento adequado dele.
Capture esse seletor anterior antes de instalar o seu. Procurar o padrão atual de dentro do substituto pode simplesmente chamar o substituto de novo.
Registre o esquema, o host, a porta original e a porta efetiva ao diagnosticar uma divergência. Não dependa de um único número observado nem da ordem das chamadas entre implementações do JDK. A política deve tomar uma decisão correta para cada URI fornecida.