พา buffer CONNECT ของ Beast เข้าสู่ TLS handshake
ส่งไบต์ที่เหลืออยู่หลังการตอบกลับ CONNECT ไปยัง TLS handshake แบบมี buffer ของ Asio แล้วใช้ปริมาณที่มันใช้ไปอย่างแม่นยำ
หลังจาก Beast อ่านส่วนหัวการตอบกลับ CONNECT ของพร็อกซีแล้ว ให้ตรวจทั้งสถานะการตอบกลับและ buffer แบบไดนามิก การอ่านอาจดึง ไบต์ที่อยู่เลยจุดสิ้นสุดของส่วนหัว และเก็บไว้ใน buffer ที่ให้มา หากเริ่ม TLS ด้วย overload ที่อ่านเฉพาะซ็อกเก็ต ไบต์ที่เก็บไว้เหล่านั้นจะอยู่นอกเส้นทางอินพุตของ TLS
สำหรับสตรีม WebSocket ที่ชั้นถัดไปเป็นสตรีม SSL ให้ใช้ overload ของ handshake แบบมี buffer ในเซสชัน yield_context ที่มีอยู่ โดยคง buffer ให้มีชีวิตตลอดการดำเนินการ:
http::response_parser<http::empty_body> response;
http::async_read_header(
beast::get_lowest_layer(ws), buffer, response, yield[ec]);
if (ec) return;
auto status = response.get().result_int();
if (status < 200 || status >= 300) return;
std::size_t used = ws.next_layer().async_handshake(
ssl::stream_base::client, buffer.data(), yield[ec]);
if (ec) return;
buffer.consume(used);
การคืนค่าตอนต้นคือทางออกเมื่อเซสชันล้มเหลว ให้แนบการรายงานข้อผิดพลาดและการทำความสะอาดตามปกติไว้ที่นั่น มีเพียงการตอบกลับ CONNECT ที่สำเร็จเท่านั้นที่สร้างอุโมงค์ หน้าถูกปฏิเสธต้องไม่กลายเป็นอินพุตของ TLS
overload แบบมี buffer จะเสร็จสิ้นพร้อมรหัสข้อผิดพลาดและจำนวนไบต์ จำนวนนั้นบอกว่าใช้ไปกี่ไบต์จาก buffer ที่ให้มา หลังเสร็จสิ้นให้ลบคำนำหน้านั้นออกอย่างแม่นยำด้วย consume(used) อย่าล้าง buffer ก่อนเริ่มการดำเนินการ อย่าเปลี่ยนที่จัดเก็บขณะ handshake ค้างอยู่ และอย่าสมมติว่าการดำเนินการใช้ไบต์ที่ให้มาทุกไบต์
กับ TLS ปกติที่ไคลเอนต์เริ่มทันทีหลัง CONNECT นั้น buffer อาจว่างเปล่า overload นี้จัดการกรณีนั้นด้วย วัตถุประสงค์คือรักษาขอบเขตของสตรีม มันไม่ได้ทำให้ข้อมูลพร็อกซีส่วนเกินใด ๆ เป็น TLS ที่ถูกต้อง คงการตรวจสอบชื่อโฮสต์ปลายทางและการตั้งค่า SNI ไว้ที่ชั้น SSL ก่อน handshake และเริ่มการอัปเกรด WebSocket หลัง TLS สำเร็จเท่านั้น