Keď Beast prečíta hlavičku odpovede CONNECT od proxy, skontrolujte stav odpovede aj dynamický buffer. Operácia čítania môže získať bajty za koncom hlavičky a ponechať ich v dodanom bufferi. Ak TLS spustíte preťažením, ktoré číta iba socket, tieto ponechané bajty zostanú mimo vstupnej cesty TLS.

Pre WebSocket stream, ktorého ďalšou vrstvou je SSL stream, použite bufferované preťaženie handshake. V existujúcej relácii yield_context s buffer udržiavaným nažive počas všetkých operácií:

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

Časné návraty predstavujú chybové výstupy relácie; pripojte tam obvyklé hlásenie chýb a čistenie. Tunel vytvorí iba úspešná odpoveď CONNECT. Stránka odmietnutia sa nesmie stať vstupom TLS.

Bufferované preťaženie končí s kódom chyby a počtom bajtov. Tento počet udáva, koľko bajtov spotrebovalo z dodaných bufferov. Po dokončení odstráňte presne tento prefix pomocou consume(used). Buffer pred začiatkom operácie nevyprázdňujte, nemeňte jeho úložisko, kým handshake čaká, a nepredpokladajte, že operácia spotrebovala každý dodaný bajt.

Pri bežnom TLS iniciovanom klientom hneď po CONNECT môže byť buffer prázdny. Preťaženie zvládne aj tento prípad. Jeho účelom je zachovať hranice streamu; nerobí z ľubovoľných ďalších proxy dát platný TLS. Overenie názvu cieľového hostiteľa a konfiguráciu SNI udržujte na SSL vrstve pred handshake a upgrade na WebSocket spúšťajte až po úspešnom TLS.

Súvisiace články