Poté co Beast přečte hlavičku odpovědi CONNECT od proxy, zkontrolujte jak stav odpovědi, tak dynamický buffer. Operace čtení může načíst bajty za ukončovacím prvkem hlavičky a ponechat je v dodaném bufferu. Pokud TLS spustíte přetížením, které čte jen socket, tyto ponechané bajty zůstanou mimo vstupní cestu TLS.

Pro WebSocket stream, jehož další vrstvou je SSL stream, použijte bufferované přetížení handshake. V existující relaci yield_context s buffer udržovaným po celou dobu operací:

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 představují chybové výstupy relace; připojte tam obvyklé hlášení chyb a úklid. Tunel vytvoří pouze úspěšná odpověď CONNECT. Stránka odmítnutí se nesmí stát vstupem TLS.

Bufferované přetížení končí s kódem chyby a počtem bajtů. Tento počet udává, kolik bajtů spotřebovalo z dodaných bufferů. Po dokončení odstraňte přesně tento prefix pomocí consume(used). Buffer před zahájením operace nevymazávejte, neměňte jeho úložiště, dokud handshake čeká, a nepředpokládejte, že operace spotřebovala každý dodaný bajt.

U běžného TLS iniciovaného klientem hned po CONNECT může být buffer prázdný. Přetížení zvládá i tento případ. Jeho účelem je zachovat hranice streamu; nedělá z libovolných dalších proxy dat platný TLS. Ověření názvu cílového hostitele a konfiguraci SNI udržujte na SSL vrstvě před handshake a upgrade na WebSocket spouštějte až po úspěšném TLS.

Související články