Nakon što Beast pročita zaglavlje CONNECT odgovora proxyja, provjerite i status odgovora i dinamički međuspremnik. Operacija čitanja može dohvatiti bajtove iza završetka zaglavlja i zadržati ih u dostavljenom međuspremniku. 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 međuspremljenu 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 pogrešaka i čišćenje. Samo uspješan CONNECT odgovor uspostavlja tunel. Stranica odbijanja ne smije postati TLS ulaz.

Međuspremljena varijanta završava s kodom pogreške i brojem bajtova. Taj broj opisuje koliko je bajtova potrošila iz dostavljenih međuspremnika. Nakon završetka uklonite točno taj prefiks pomoću consume(used). Ne čistite međuspremnik 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 međuspremnik 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