สร้าง CONNECT ก่อนเริ่มการจับมือ TLS ของ Asio
ใช้เลเยอร์ล่างของสตรีม SSL ของ Asio สำหรับการแลกเปลี่ยนผ่านพร็อกซี HTTP ปกติ แล้วจึงเริ่ม TLS ผ่านอุโมงค์ที่ตอบรับแล้ว
สำหรับ ssl::stream<tcp::socket> ผ่านพร็อกซี HTTP ปกติ ให้ใช้ทรานสปอร์ตดิบก่อนที่จะให้มันทำ TLS ปลายทาง:
auto& transport = tlsStream.next_layer();
- เชื่อมต่อทรานสปอร์ตนั้นกับโฮสต์และพอร์ตของพร็อกซี เมื่อปลายทาง HTTPS สาธารณะที่ได้รับอนุญาตไม่มีข้อมูลรับรองพร็อกซีที่ตั้งไว้ รายการพร็อกซี HTTP มีปลายทางที่เป็นตัวเลือก; ตรวจสอบว่าตัวเลือกนั้นอนุญาตอุโมงค์ที่ขอ
- ส่ง CONNECT โดยระบุ authority ของปลายทาง เช่น
api.example:443และแยกวิเคราะห์ส่วนหัวการตอบกลับทั้งหมดบนทรานสปอร์ตธรรมดา การตอบ 2xx ที่สำเร็จจะเปิดอุโมงค์; การปฏิเสธยังคงเป็นการตอบกลับของพร็อกซี HTTP - กำหนดค่าชื่อโฮสต์ปลายทาง, SNI ที่จำเป็น, รากที่เชื่อถือได้ และการตรวจสอบ peer แล้วเริ่มการจับมือฝั่งไคลเอนต์บน
tlsStream - หลัง TLS สำเร็จ ให้ใช้การอ่านและเขียนผ่านสตรีม SSL สำหรับแอปพลิเคชัน การอ่านเลเยอร์ล่างโดยตรง ณ จุดนั้นจะข้ามการประมวลผล TLS
นำข้อมูลส่วนเกินของตัวแยกวิเคราะห์ HTTP ไปยังขั้นถัดไป Asio มีโอเวอร์โหลดการจับมือแบบมีบัฟเฟอร์; การทิ้งส่วนท้ายที่ตัวแยกวิเคราะห์ถืออยู่อาจทำให้ไบต์ที่อ่านจากซ็อกเก็ตแล้วสูญหาย
ในชนิดง่าย ๆ นี้ next_layer และ lowest_layer ต่างก็ไปถึง TCP ตัวห่อเพิ่มเติมอาจทำให้ต่างกัน ดังนั้นให้เลือกอินเทอร์เฟซที่พาโปรโตคอลสายจริงของพร็อกซี พร็อกซี HTTPS เพิ่มขั้น TLS อีกขั้นและอยู่นอกลำดับ CONNECT แบบข้อความธรรมดานี้