ข้อผิดพลาดพร็อกซีของ 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 ได้ การกำหนดค่า builder อื่นไม่ทำให้ไคลเอนต์ที่สร้างแล้วอัปเดต
ตรวจสอบความเป็นเจ้าของ builder ด้วย: HttpClientBuilder ระบุว่าตัวจัดการการเชื่อมต่อที่ให้มาอย่างชัดเจนสามารถแทนที่อินพุตการกำหนดค่า SSL แยกต่างหากของมันได้ ใส่โรงงานที่จำเป็นในรีจิสทรีของตัวจัดการ แทนที่จะถือว่าการเรียก setSSLContext ภายหลังจะแทนที่ภายในของมัน
การวินิจฉัยนี้เกี่ยวกับรีจิสทรีสคีมาท้องถิ่น การท้าทายการพิสูจน์ตัวตนพร็อกซีหรือปลายทางที่ถูกปฏิเสธเป็นผลลัพธ์ภายหลังที่แตกต่างกัน เก็บการลงทะเบียนโรงงานทั้งสองไว้ขณะตรวจสอบการตอบสนองเหล่านั้น