ในแอปพลิเคชัน 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 ภายหลังจะแทนที่ภายในของมัน

การวินิจฉัยนี้เกี่ยวกับรีจิสทรีสคีมาท้องถิ่น การท้าทายการพิสูจน์ตัวตนพร็อกซีหรือปลายทางที่ถูกปฏิเสธเป็นผลลัพธ์ภายหลังที่แตกต่างกัน เก็บการลงทะเบียนโรงงานทั้งสองไว้ขณะตรวจสอบการตอบสนองเหล่านั้น

บทความที่เกี่ยวข้อง