Beast-тің CONNECT буферін TLS қол алысуына өткізу
CONNECT жауабынан кейін қалған байттарды Asio-ның буферлі TLS қол алысуына жіберіп, содан кейін ол пайдаланған көлемді дәл сонша тұтыныңыз.
Beast проксидің CONNECT жауап тақырыбын оқығаннан кейін жауап күйін және динамикалық буферді тексеріңіз. Оқу операциясы тақырыптың аяқталуынан әрі қарайғы байттарды алып, оларды берілген буферде сақтауы мүмкін. TLS-ті тек сокетті оқитын нұсқамен бастасаңыз, сол сақталған байттар TLS кіріс жолының сыртында қалады.
Келесі қабаты SSL ағыны болатын WebSocket ағыны үшін буферлі қол алысу нұсқасын пайдаланыңыз. Бар yield_context сессиясында 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);
Ерте қайтарулар сессияның сәтсіздік шығулары; сол жерде әдеттегі қате есебін және тазалауды тіркеңіз. Туннельді тек сәтті CONNECT жауабы орнатады. Бас тарту беті TLS кірісіне айналмауы керек.
Буферлі нұсқа қате кодымен және байт санымен аяқталады. Бұл сан берілген буферлерден қанша байт тұтынғанын сипаттайды. Аяқталғаннан кейін дәл сол префиксті consume(used) арқылы жойыңыз. Операция басталғанға дейін буферді тазаламаңыз, қол алысу күтіп тұрғанда оның қоймасын өзгертпеңіз және операция берілген әр байтты тұтынды деп ойламаңыз.
CONNECT-тен кейін бірден клиент бастаған әдеттегі TLS-те буфер бос болуы мүмкін. Нұсқа бұл жағдайды да өңдейді. Оның мақсаты ағын шекараларын сақтау; ол кездейсоқ кейінгі прокси деректерін жарамды TLS етпейді. Қол алысу алдында SSL қабатында мақсатты хост атауын тексеру мен SNI конфигурациясын ұстаңыз және WebSocket жаңартуын TLS сәтті болғаннан кейін ғана бастаңыз.