Bawa Buffer CONNECT Beast ke dalam Handshake TLS
Teruskan byte yang tersisa setelah respons CONNECT ke handshake TLS berbuffer milik Asio, lalu konsumsi tepat sebanyak yang dipakainya.
Setelah Beast membaca header respons CONNECT dari proxy, periksa status respons dan buffer dinamis sekaligus. Operasi baca dapat mengambil byte di luar akhir header dan menyimpannya di buffer yang diberikan. Memulai TLS dengan overload yang hanya membaca socket membuat byte tersimpan itu tetap di luar jalur input TLS.
Untuk stream WebSocket yang lapisan berikutnya adalah stream SSL, gunakan overload handshake berbuffer. Dalam sesi yield_context yang sudah ada, dengan buffer dijaga tetap hidup selama 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);
Return awal adalah jalur keluar kegagalan sesi; pasang pelaporan galat dan pembersihan biasa di sana. Hanya respons CONNECT yang berhasil yang membentuk tunnel. Halaman penolakan tidak boleh menjadi input TLS.
Overload berbuffer selesai dengan kode galat dan jumlah byte. Jumlah itu menyatakan berapa byte yang dikonsumsinya dari buffer yang diberikan. Setelah selesai, hapus tepat prefiks itu dengan consume(used). Jangan kosongkan buffer sebelum operasi dimulai, jangan ubah penyimpanannya selama handshake tertunda, dan jangan menganggap operasi telah mengonsumsi setiap byte yang diberikan.
Pada TLS biasa yang dimulai klien tepat setelah CONNECT, buffer bisa kosong. Overload juga menangani kasus itu. Tujuannya menjaga batas stream; ia tidak membuat data proxy tambahan sembarang menjadi TLS yang valid. Pertahankan verifikasi nama host tujuan dan konfigurasi SNI pada lapisan SSL sebelum handshake, dan mulai upgrade WebSocket hanya setelah TLS berhasil.