Bawa Buffer CONNECT Beast ke dalam Handshake TLS
Hantar bait yang tinggal selepas respons CONNECT ke handshake TLS berbuffer Asio, kemudian guna tepat jumlah yang digunakannya.
Selepas Beast membaca pengepala respons CONNECT proksi, periksa kedua-dua status respons dan penimbal dinamik. Operasi baca boleh mengambil bait melepasi penamat pengepala dan menyimpannya dalam penimbal yang dibekalkan. Memulakan TLS dengan lebihan beban yang hanya membaca soket membiarkan bait tersimpan itu di luar laluan input TLS.
Untuk strim WebSocket yang lapisan seterusnya ialah strim SSL, gunakan lebihan beban handshake berpenimbal. Dalam sesi yield_context sedia ada, dengan buffer dikekalkan hidup sepanjang operasi:
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);
Pemulangan awal ialah jalan keluar kegagalan sesi; lampirkan pelaporan ralat dan pembersihan biasa di situ. Hanya respons CONNECT yang berjaya membentuk terowong. Halaman penolakan tidak boleh menjadi input TLS.
Lebihan beban berpenimbal selesai dengan kod ralat dan kiraan bait. Kiraan itu menerangkan berapa banyak bait yang digunakannya daripada penimbal yang dibekalkan. Selepas selesai, buang awalan itu dengan tepat menggunakan consume(used). Jangan kosongkan penimbal sebelum operasi bermula, jangan ubah storannya semasa handshake tergantung, dan jangan anggap operasi telah menggunakan setiap bait yang dibekalkan.
Dengan TLS biasa yang dimulakan klien sejurus selepas CONNECT, penimbal mungkin kosong. Lebihan beban itu juga mengendalikan kes tersebut. Tujuannya ialah memelihara sempadan strim; ia tidak menjadikan sebarang data proksi tambahan sebagai TLS yang sah. Kekalkan pengesahan nama hos destinasi dan konfigurasi SNI pada lapisan SSL sebelum handshake, dan mulakan peningkatan WebSocket hanya selepas TLS berjaya.