โปรโตคอล TCP ที่กำหนดเองสามารถเดินทางผ่านพร็อกซี HTTP ได้เมื่อพร็อกซีนั้นอนุญาต CONNECT ไปยังจุดหมาย โปรโตคอลของแอปพลิเคชันไม่จำเป็นต้องกลายเป็น HTTP: HTTP สร้างอุโมงค์ แล้วแอปพลิเคชันก็แลกเปลี่ยนไบต์ของตนเองภายใน

OpenJDK 25 มีเส้นทางผ่านพร็อกซี HTTP ใน Socket(Proxy) การนำไปปฏิบัติจะทำ การแลกเปลี่ยน CONNECT และคืนซ็อกเก็ตที่เชื่อมต่อแล้วให้แอปพลิเคชันใช้

Proxy route = new Proxy(
    Proxy.Type.HTTP,
    new InetSocketAddress("proxy.example", 8080));

try (Socket socket = new Socket(route)) {
    socket.setSoTimeout(10000);
    socket.connect(
        InetSocketAddress.createUnresolved("tcp-service.example", 8443),
        5000);
    InputStream input = socket.getInputStream();
    OutputStream output = socket.getOutputStream();
}

ส่วนนี้ใช้คลาสจาก java.net และ java.io แทนที่ปลายทางทั้งสองและทำการแลกเปลี่ยนโปรโตคอลก่อนออกจากบล็อก try สำหรับเป้าหมาย TCP สาธารณะที่ได้รับอนุญาต ให้เลือกผู้สมัคร HTTP จากรายการพร็อกซี HTTP หลังจากตรวจสอบสิทธิ์ CONNECT สำหรับพอร์ตของเป้าหมายนั้นแล้วเท่านั้น ที่อยู่พร็อกซีคือที่ที่ Java เชื่อมต่อก่อน ที่อยู่ที่ส่งไปยัง connect ระบุบริการที่พร็อกซีต้องไปถึง

จุดหมายที่ยังไม่ถูกแปลงเป็นชื่อจะเก็บชื่อโฮสต์ไว้สำหรับคำขอ CONNECT ของการนำไปปฏิบัตินี้ ส่วน InetSocketAddress ที่ถูกแปลงแล้วจะให้ที่อยู่ IP ที่แปลงแล้วกับคำขอนั้นแทน ความแตกต่างนี้สำคัญเมื่อพร็อกซีต้องแปลงชื่อบริการหรือใช้แนวนโยบายที่อิงชื่อโฮสต์

การเชื่อมต่อที่สำเร็จทิ้งอะไรไว้ให้คุณ

สตรีมที่ได้จะพาข้อมูลของบริการที่อยู่ในอุโมงค์ พวกมันไม่เปิดเผยการตอบกลับ HTTP แยกต่างหากที่แอปพลิเคชันของคุณควรอ่านแล้วทิ้ง การเพิ่มการแลกเปลี่ยน CONNECT ครั้งที่สองจะส่งข้อความ HTTP ไปยังบริการหลังจากที่ JDK สร้างอุโมงค์แล้ว

ตัวอย่างกำหนดเวลาหมดเวลาการเชื่อมต่อและเวลาหมดเวลาการอ่านซ็อกเก็ต สิ่งเหล่านี้เป็นการควบคุมแยกกัน ไม่ใช่กำหนดเวลารวมเพียงครั้งเดียวสำหรับเซสชันของแอปพลิเคชัน

สิทธิ์ CONNECT ยังเป็นของพร็อกซี ปลายทางที่ส่งต่อคำขอเว็บทั่วไปอาจปฏิเสธพอร์ตของบริการหรือเรียกให้ยืนยันตัวตนก่อนเปิดอุโมงค์ แยกความล้มเหลวเหล่านั้นออกจากเซิร์ฟเวอร์ที่ยอมรับอุโมงค์แต่ภายหลังปฏิเสธโปรโตคอลของแอปพลิเคชันของคุณ

หากโปรโตคอลนั้นต้องใช้ TLS ให้เจรจา TLS ผ่านซ็อกเก็ตที่เชื่อมต่อแล้วด้วยชื่อโฮสต์ที่ตั้งใจของบริการและการตรวจสอบใบรับรองตามปกติ CONNECT เพียงอย่างเดียวไม่ได้เข้ารหัสสตรีม สำหรับ HTTP API จริง ไคลเอนต์ HTTP ยังคงเป็นอินเทอร์เฟซที่สะดวกกว่าเพราะจัดการข้อความ HTTP ได้ด้วย

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