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 కాన్ఫిగరేషన్ను ఉంచి, TLS విజయవంతమైన తర్వాత మాత్రమే WebSocket అప్గ్రేడ్ ప్రారంభించండి.