שגיאת פרוקסי ב-HttpClient 4: הפרוטוקול http אינו נתמך
השאירו את מפעל ה-HTTP הפשוט ברישום Apache HttpClient 4 מותאם כאשר מסלול HTTPS מתחבר תחילה לפרוקסי HTTP.
ביישום Apache HttpClient 4, יעד HTTPS אינו אומר שכל חיבור מתחיל ב-TLS. אל פרוקסי HTTP רגיל מגיעים בחיבור לא מוצפן לפני ש-CONNECT פותח את המנהרה ו-TLS נבנה בשכבות לעבר היעד.
אם מנהל חיבורים מותאם רושם רק https, הקפיצה הראשונה דרך הפרוקסי עלולה להיכשל עם UnsupportedSchemeException: http protocol is not supported.
עבור API 4.5, כללו את שני המפעלים בעת בניית אותו מנהל:
var registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", tlsFactory)
.build();
var manager = new PoolingHttpClientConnectionManager(registry);
var client = HttpClients.custom()
.setConnectionManager(manager)
.setProxy(new HttpHost("proxy.example.net", 8080, "http"))
.build();
tlsFactory הוא ה-SSLConnectionSocketFactory הקיים של היישום, עם בדיקת האמון ושם המארח המיועדת. הסוגים המוצגים שייכים לחבילות org.apache.http של Apache 4. הקטע מניח הסקת טיפוסים של משתנים מקומיים ב-Java; קוד Java ישן יותר יכול להשתמש בטיפוסים מפורשים.
חברו את המנהל המתוקן ללקוח שבאמת משמש לבקשה. עבור בקשת HTTPS ציבורית מורשית ללא אימות פרוקסי, רשומת HTTP מרשימת פרוקסי HTTP יכולה למלא את כתובת הפרוקסי של HttpHost. הגדרת בונה אחר אינה מעדכנת לקוח שכבר נבנה.
בדקו גם את הבעלות של הבונה: HttpClientBuilder מתעד שמנהל חיבורים שסופק במפורש יכול לעקוף את קלטי תצורת ה-SSL הנפרדים שלו. הניחו את המפעלים הנדרשים ברישום של המנהל במקום להניח שקורא עתידי ל-setSSLContext יחליף את פנימיותיו.
אבחון זה נוגע ברישום הסכמות המקומי. אתגר אימות פרוקסי או יעד שנדחה הוא תוצאה מאוחרת ושונה. שמרו על שתי רישומות המפעלים בזמן שאתם חוקרים את התגובות האלה.