Prenesite Beastov CONNECT medpomnilnik v rokovanje TLS
Posredujte bajte, ki ostanejo po odgovoru CONNECT, v medpomnilniško rokovanje TLS v Asio, nato porabite natanko toliko, kolikor ga je uporabilo.
Ko Beast prebere glavo odgovora CONNECT od posrednika, preglejte tako stanje odgovora kot dinamični medpomnilnik. Bralna operacija lahko pridobi bajte onkraj konca glave in jih obdrži v priloženem medpomnilniku. Če TLS zaženete s preobremenitvijo, ki bere samo vtičnico, ti obdržani bajti ostanejo zunaj vhodne poti TLS.
Za tok WebSocket, katerega naslednja plast je tok SSL, uporabite medpomnilniško preobremenitev rokovanja. V obstoječi seji yield_context, pri čemer buffer ostane živ skozi vse 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);
Zgodnji vrnitvi sta izhoda seje ob neuspehu; tam pripnite običajno poročanje o napakah in čiščenje. Predor vzpostavi le uspešen odgovor CONNECT. Stran zavrnitve ne sme postati vhod TLS.
Medpomnilniška preobremenitev se zaključi s kodo napake in številom bajtov. To število opisuje, koliko bajtov je porabila iz priloženih medpomnilnikov. Po zaključku odstranite natanko to predpono z consume(used). Medpomnilnika ne počistite pred začetkom operacije, ne spreminjajte njegove shrambe, medtem ko rokovanje čaka, in ne predpostavljajte, da je operacija porabila vsak priloženi bajt.
Pri običajnem TLS, ki ga odjemalec zažene takoj po CONNECT, je medpomnilnik lahko prazen. Preobremenitev obravnava tudi ta primer. Njen namen je ohranjanje meja toka; poljubnih nadaljnjih podatkov posrednika ne naredi veljavnega TLS. Pred rokovanjem ohranite preverjanje imena ciljnega gostitelja in nastavitve SNI na plasti SSL ter nadgradnjo WebSocket začnite šele po uspešnem TLS.