Java ProxySelector: ontbrekende HTTP- en HTTPS-poorten normaliseren
Normaliseer weggelaten HTTP-poorten voordat je bestemmingen vergelijkt in een aangepaste ProxySelector, en houd HTTP-regels buiten de selectie van ruwe sockets.
Een regel stuurt http://reports.example:80/ via een proxy maar laat http://reports.example/ rechtstreeks gaan. Die URL's beschrijven hetzelfde gewone HTTP-eindpunt. De mismatch komt meestal doordat hun geparseerde poorten letterlijk worden vergeleken.
URI.getPort() geeft -1 terug wanneer er geen poort in de URI staat. Hij vervangt niet de standaardwaarde van het schema. Een routeringsbeleid dat de waarde met 80 vergelijkt, mist de tweede 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;
}
Pas dezelfde normalisatie toe op beide kanten van de vergelijking. Alleen de URI van het verzoek repareren laat een geconfigureerde bestemming met een weggelaten poort nog steeds zonder overeenkomst. Vergelijk de host, de effectieve poort en het bedoelde schema; wijs misvormde of hostloze bestemmingen af via een gedefinieerd foutpad.
Maak niet van elke callback een HTTP-beslissing
Een standaardselector kan ook worden geraadpleegd voor verbindingen met ruwe sockets, met het schema socket. Alleen een overeenkomst van host en poort mag er niet toe leiden dat die callback een HTTP-proxy teruggeeft die bedoeld is voor URL-verzoeken. Delegeer niet-ondersteunde schema's naar de vorige selector en behoud het passende gedrag daarvan.
Leg die vorige selector vast voordat je de jouwe installeert. De huidige standaard opzoeken van binnen de vervanger kan de vervanger gewoon opnieuw aanroepen.
Log het schema, de host, de oorspronkelijke poort en de effectieve poort bij het diagnosticeren van een mismatch. Vertrouw niet op één waargenomen getal of de volgorde van callbacks tussen JDK-implementaties. Het beleid moet voor elke geleverde URI een juiste beslissing nemen.