Nakon što Beast pročita zaglavlje CONNECT odgovora proxyja, provjerite i status odgovora i dinamički bafer. Operacija čitanja može dohvatiti bajtove iza završetka zaglavlja i zadržati ih u dostavljenom baferu. Ako TLS pokrenete varijantom koja čita samo socket, ti zadržani bajtovi ostaju izvan TLS ulaznog puta.

Za WebSocket tok čiji je sljedeći sloj SSL tok, koristite baferisanu varijantu rukovanja. U postojećoj sesiji yield_context, uz buffer koji ostaje živ kroz sve operacije:

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);

Rani povrati predstavljaju izlaze sesije pri neuspjehu; tamo pridružite uobičajeno prijavljivanje grešaka i čišćenje. Samo uspješan CONNECT odgovor uspostavlja tunel. Stranica odbijanja ne smije postati TLS ulaz.

Baferisana varijanta završava s kodom greške i brojem bajtova. Taj broj opisuje koliko je bajtova potrošila iz dostavljenih bafera. Nakon završetka uklonite točno taj prefiks pomoću consume(used). Ne čistite bafer prije početka operacije, ne mijenjajte njegovu pohranu dok rukovanje čeka i ne pretpostavljajte da je operacija potrošila svaki dostavljeni bajt.

Kod običnog TLS-a koji klijent pokrene odmah nakon CONNECT-a bafer može biti prazan. Varijanta obrađuje i taj slučaj. Njena svrha je očuvanje granica toka; ne čini proizvoljne dodatne proxy podatke valjanim TLS-om. Provjeru imena odredišnog hosta i SNI konfiguraciju držite na SSL sloju prije rukovanja, a WebSocket nadogradnju započnite tek nakon uspješnog TLS-a.

Povezani članci