Pārnest Beast CONNECT buferi TLS rokasspiedienā
Nododiet pēc CONNECT atbildes atlikušos baitus Asio buferētajai TLS rokasspiedienai, pēc tam patērējiet tieši tik, cik tā izmantoja.
Kad Beast ir nolasījis starpniekservera CONNECT atbildes galveni, pārbaudiet gan atbildes statusu, gan dinamisko buferi. Lasīšanas darbība var iegūt baitus aiz galvenes beigām un paturēt tos nodotajā buferī. Ja TLS sākat ar pārslodzi, kas lasa tikai ligzdu, šie paturētie baiti paliek ārpus TLS ievades ceļa.
WebSocket straumei, kuras nākamais slānis ir SSL straume, izmantojiet buferēto rokasspiediena pārslodzi. Esošā yield_context sesijā, visu darbību laikā uzturot dzīvu buffer:
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);
Agrākie atgriezieni ir sesijas atteices izejas; tur pievienojiet parasto kļūdu atskaiti un tīrīšanu. Tuneli izveido tikai veiksmīga CONNECT atbilde. Noraidīšanas lapai nav jākļūst par TLS ievadi.
Buferētā pārslodze beidzas ar kļūdas kodu un baitu skaitu. Šis skaits apraksta, cik baitu tā patērēja no nodotajiem buferiem. Pēc pabeigšanas noņemiet tieši šo prefiksu ar consume(used). Neiztīriet buferi pirms darbības sākuma, nemainiet tā krātuvi, kamēr rokasspiediens gaida, un nepieņemiet, ka darbība patērēja katru nodoto baitu.
Parastā klienta uzsāktā TLS gadījumā uzreiz pēc CONNECT buferis var būt tukšs. Pārslodze apstrādā arī šo gadījumu. Tās mērķis ir saglabāt straumes robežas; tā nepadara patvaļīgus turpmākos starpniekservera datus par derīgu TLS. Pirms rokasspiediena SSL slānī saglabājiet galamērķa resursdatora nosaukuma pārbaudi un SNI konfigurāciju, un sāciet WebSocket jaunināšanu tikai pēc veiksmīga TLS.