Java ProxySelector: נרמול פורטים חסרים של HTTP ו-HTTPS
נרמלו פורטי HTTP שהושמטו לפני השוואת יעדים ב-ProxySelector מותאם אישית, והרחיקו כללי HTTP מבחירת סוקטים גולמיים.
כלל שולח את http://reports.example:80/ דרך פרוקסי אך מניח ל-http://reports.example/ לעבור ישירות. כתובות אלו מתארות את אותה נקודת קצה HTTP רגילה. חוסר ההתאמה נובע בדרך כלל מהשוואה מילולית של הפורטים המפוענחים שלהן.
URI.getPort() מחזיר -1 כאשר אין פורט ב-URI. הוא אינו מחליף את ברירת המחדל של הסכימה. מדיניות ניתוב שמשווה את הערך ל-80 תפספס את הכתובת השנייה.
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 שמסופק.