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 амжилттай болсны дараа л эхлүүл.