Java ProxySelector: normalizzare le porte HTTP e HTTPS mancanti
Normalizza le porte HTTP omesse prima di confrontare le destinazioni in un ProxySelector personalizzato e tieni le regole HTTP fuori dalla selezione dei socket grezzi.
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.