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 ବିନ୍ୟାସ ରଖନ୍ତୁ, ଏବଂ TLS ସଫଳ ହେବା ପରେ ହିଁ WebSocket ଅପଗ୍ରେଡ ଆରମ୍ଭ କରନ୍ତୁ।

ସମ୍ପର୍କିତ ପ୍ରବନ୍ଧ