Una regola invia http://reports.example:80/ attraverso un proxy ma lascia http://reports.example/ andare diretto. Questi URL descrivono lo stesso normale endpoint HTTP. La discrepanza di solito deriva dal confronto letterale delle porte analizzate.

URI.getPort() restituisce -1 quando nell'URI non compare alcuna porta. Non sostituisce il valore predefinito dello schema. Una politica di instradamento che confronta il valore con 80 perderà il secondo 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;
}

Applica la stessa normalizzazione a entrambi i lati del confronto. Correggere solo l'URI della richiesta lascia comunque una destinazione configurata con una porta omessa senza corrispondenza. Confronta host, porta effettiva e schema previsto; rifiuta le destinazioni malformate o prive di host tramite un percorso di errore definito.

Non trasformare ogni callback in una decisione HTTP

Un selettore predefinito può essere interrogato anche per connessioni socket grezze, con lo schema socket. Una corrispondenza di solo host e porta non deve far restituire a quel callback un proxy HTTP pensato per le richieste URL. Delega gli schemi non supportati al selettore precedente, preservandone il comportamento appropriato.

Cattura quel selettore precedente prima di installare il tuo. Cercare il valore predefinito corrente dall'interno del sostituto può semplicemente richiamare il sostituto.

Registra schema, host, porta originale e porta effettiva quando diagnostichi una discrepanza. Non affidarti a un solo numero osservato né all'ordine delle callback tra implementazioni JDK. La politica deve prendere una decisione corretta per ogni URI fornito.

Articoli correlati