Αφού ο Beast διαβάσει την κεφαλίδα απόκρισης CONNECT ενός proxy, εξετάστε τόσο την κατάσταση της απόκρισης όσο και το δυναμικό buffer. Η λειτουργία ανάγνωσης μπορεί να φέρει byte πέρα από τον τερματισμό της κεφαλίδας και να τα κρατήσει στο buffer που δόθηκε. Αν ξεκινήσετε το TLS με μια υπερφόρτωση που διαβάζει μόνο τον υποδοχέα, αυτά τα κρατημένα byte μένουν έξω από τη διαδρομή εισόδου του TLS.

Για ροή WebSocket της οποίας το επόμενο επίπεδο είναι η ροή SSL, χρησιμοποιήστε την υπερφόρτωση χειραψίας με buffer. Σε υπάρχουσα συνεδρία 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.

Η υπερφόρτωση με buffer ολοκληρώνεται με κωδικό σφάλματος και πλήθος byte. Το πλήθος αυτό περιγράφει πόσα byte κατανάλωσε από τα buffer που δόθηκαν. Μετά την ολοκλήρωση αφαιρέστε ακριβώς αυτό το πρόθεμα με consume(used). Μην αδειάσετε το buffer πριν ξεκινήσει η λειτουργία, μην αλλάξετε τον χώρο αποθήκευσής του όσο η χειραψία εκκρεμεί και μην υποθέσετε ότι η λειτουργία κατανάλωσε κάθε byte που δόθηκε.

Με το συνηθισμένο TLS που ξεκινά ο πελάτης αμέσως μετά το CONNECT, το buffer μπορεί να είναι κενό. Η υπερφόρτωση χειρίζεται και αυτή την περίπτωση. Ο σκοπός της είναι η διατήρηση των ορίων ροής· δεν κάνει αυθαίρετα δεδομένα proxy έγκυρο TLS. Κρατήστε την επαλήθευση του ονόματος κεντρικού υπολογιστή προορισμού και τη ρύθμιση SNI στο επίπεδο SSL πριν από τη χειραψία και ξεκινήστε την αναβάθμιση WebSocket μόνο αφού πετύχει το TLS.

Σχετικά άρθρα