Vigye át a Beast CONNECT-pufferét a TLS-kézfogásba
Adja át a CONNECT-válasz után megmaradt bájtokat az Asio pufferelt TLS-kézfogásának, majd pontosan annyit fogyasszon, amennyit az felhasznált.
Miután a Beast beolvasta egy proxy CONNECT-válaszfejlécét, vizsgálja meg a válasz állapotát és a dinamikus puffert is. Az olvasási művelet a fejléc lezárója utáni bájtokat is behozhat, és a megadott pufferben tarthatja őket. Ha a TLS-t olyan túlterheléssel indítja, amely csak a socketet olvassa, ezek a megtartott bájtok a TLS bemeneti útvonalán kívül maradnak.
Egy WebSocket-folyamhoz, amelynek következő rétege az SSL-folyam, a pufferelt kézfogás-túlterhelést használja. Egy meglévő yield_context-munkamenetben, a buffer objektumot a műveletek alatt életben tartva:
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);
A korai visszatérések a munkamenet hibaágai; ott csatolja a szokásos hibajelentést és takarítást. Csak a sikeres CONNECT-válasz hozza létre az alagutat. Az elutasítási oldal nem válhat TLS-bemenetté.
A pufferelt túlterhelés hibakóddal és bájtszámmal fejeződik be. Ez a szám azt írja le, hány bájtot fogyasztott a megadott pufferekből. Befejezés után pontosan ezt az előtagot távolítsa el a consume(used) hívással. Ne törölje a puffert a művelet előtt, ne módosítsa a tárolóját, amíg a kézfogás függőben van, és ne feltételezze, hogy a művelet minden megadott bájtot elfogyasztott.
A CONNECT után közvetlenül az ügyfél által indított szokásos TLS esetén a puffer üres lehet. A túlterhelés ezt az esetet is kezeli. Célja a folyamhatárok megőrzése; nem tesz tetszőleges további proxyadatot érvényes TLS-sé. A kézfogás előtt tartsa meg a cél hosztnév-ellenőrzést és az SNI-konfigurációt az SSL-rétegen, és a WebSocket-frissítést csak a sikeres TLS után indítsa el.