Ένας κανόνας στέλνει το http://reports.example:80/ μέσω διακομιστή μεσολάβησης αλλά αφήνει το http://reports.example/ να πάει απευθείας. Αυτά τα URL περιγράφουν το ίδιο συνηθισμένο τελικό σημείο HTTP. Η αναντιστοιχία προκύπτει συνήθως από τη σύγκριση των αναλυμένων θυρών τους κατά γράμμα.

Το URI.getPort() επιστρέφει -1 όταν δεν εμφανίζεται θύρα στο URI. Δεν αντικαθιστά την προεπιλογή για το σχήμα. Μια πολιτική δρομολόγησης που συγκρίνει την τιμή με 80 θα χάσει το δεύτερο 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;
}

Εφαρμόστε την ίδια κανονικοποίηση και στις δύο πλευρές της σύγκρισης. Η διόρθωση μόνο του URI του αιτήματος αφήνει ακόμη έναν ρυθμισμένο προορισμό με παραλειπόμενη θύρα χωρίς αντιστοίχιση. Συγκρίνετε τον κεντρικό υπολογιστή, την πραγματική θύρα και το επιδιωκόμενο σχήμα· απορρίπτετε παραμορφωμένους ή χωρίς κεντρικό υπολογιστή προορισμούς μέσω καθορισμένης διαδρομής σφάλματος.

Μην μετατρέπετε κάθε επανάκληση σε απόφαση HTTP

Ένας προεπιλεγμένος επιλογέας μπορεί να ερωτηθεί και για συνδέσεις ακατέργαστων υποδοχών, με το σχήμα socket. Η αντιστοίχιση μόνο κεντρικού υπολογιστή και θύρας δεν πρέπει να κάνει αυτή την επανάκληση να επιστρέφει διακομιστή μεσολάβησης HTTP που προορίζεται για αιτήματα URL. Αναθέστε τα μη υποστηριζόμενα σχήματα στον προηγούμενο επιλογέα, διατηρώντας την κατάλληλη συμπεριφορά του.

Καταγράψτε αυτόν τον προηγούμενο επιλογέα πριν εγκαταστήσετε τον δικό σας. Η αναζήτηση της τρέχουσας προεπιλογής από μέσα στο υποκατάστατο μπορεί απλώς να καλέσει ξανά το υποκατάστατο.

Καταγράφετε το σχήμα, τον κεντρικό υπολογιστή, την αρχική θύρα και την πραγματική θύρα όταν διαγιγνώσκετε αναντιστοιχία. Μην βασίζεστε σε έναν παρατηρούμενο αριθμό ή σε σειρά επανακλήσεων μεταξύ υλοποιήσεων JDK. Η πολιτική πρέπει να λαμβάνει σωστή απόφαση για κάθε παρεχόμενο URI.

Σχετικά άρθρα