Kun Beast on lukenut välityspalvelimen CONNECT-vastauksen otsakkeen, tarkista sekä vastauksen tila että dynaaminen puskuri. Lukutoiminto voi hakea tavuja otsakkeen lopun ulkopuolelta ja pitää ne annetussa puskurissa. Jos TLS käynnistetään ylikuormituksella, joka lukee vain sockettia, nuo säilytetyt tavut jäävät TLS:n syöttöpolun ulkopuolelle.

WebSocket-virralle, jonka seuraava kerros on SSL-virta, käytä puskuroitua kättely-ylikuormitusta. Olemassa olevassa yield_context-istunnossa pitäen buffer elossa kaikkien toimintojen ajan:

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

Varhaiset paluut ovat istunnon virhepoistumisia; liitä niihin tavallinen virheraportointi ja siivous. Vain onnistunut CONNECT-vastaus muodostaa tunnelin. Hylkäyssivusta ei saa tulla TLS-syötettä.

Puskuroitu ylikuormitus päättyy virhekoodiin ja tavumäärään. Tämä määrä kertoo, kuinka monta tavua se kulutti annetuista puskureista. Poista valmistumisen jälkeen täsmälleen tämä etuliite komennolla consume(used). Älä tyhjennä puskuria ennen toiminnon alkua, älä muuta sen tallennustilaa kättelyn ollessa kesken äläkä oleta, että toiminto kulutti jokaisen annetun tavun.

Tavallisessa asiakkaan heti CONNECTin jälkeen käynnistämässä TLS:ssä puskuri voi olla tyhjä. Ylikuormitus käsittelee myös tämän tapauksen. Sen tarkoitus on säilyttää virran rajat; se ei tee mielivaltaisista myöhemmistä välityspalvelintiedoista kelvollista TLS:ää. Pidä kohdeisäntänimen varmennus ja SNI-asetukset SSL-kerroksessa ennen kättelyä ja aloita WebSocket-päivitys vasta, kun TLS on onnistunut.

Aiheeseen liittyvät artikkelit