Beast’in CONNECT tamponunu TLS el sıkışmasına taşıyın
CONNECT yanıtından sonra kalan baytları Asio’nun tamponlu TLS el sıkışmasına aktarın, ardından tam olarak kullandığı miktarı tüketin.
Beast bir proxy’nin CONNECT yanıt başlığını okuduktan sonra hem yanıt durumunu hem de dinamik tamponu inceleyin. Okuma işlemi başlığın bitiminin ötesindeki baytları çekip sağlanan tamponda tutabilir. TLS’i yalnızca soketi okuyan bir aşırı yüklemeyle başlatırsanız, tutulan bu baytlar TLS giriş yolunun dışında kalır.
Bir sonraki katmanı SSL akışı olan WebSocket akışı için tamponlu el sıkışma aşırı yüklemesini kullanın. Mevcut bir yield_context oturumunda, buffer tüm işlemler boyunca canlı tutularak:
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);
Erken dönüşler oturumun hata çıkışlarıdır; olağan hata bildirimini ve temizliği oraya bağlayın. Tüneli yalnızca başarılı bir CONNECT yanıtı kurar. Bir ret sayfası TLS girişine dönüşmemelidir.
Tamponlu aşırı yükleme bir hata kodu ve bayt sayısıyla tamamlanır. Bu sayı, sağlanan tamponlardan kaç bayt tükettiğini açıklar. Tamamlandıktan sonra tam olarak o öneki consume(used) ile kaldırın. İşlem başlamadan önce tamponu boşaltmayın, el sıkışması beklemedeyken depolamasını değiştirmeyin ve işlemin sağlanan her baytı tükettiğini varsaymayın.
CONNECT’ten hemen sonra istemcinin başlattığı olağan TLS’te tampon boş olabilir. Aşırı yükleme bu durumu da ele alır. Amacı akış sınırlarını korumaktır; rastgele sonraki proxy verilerini geçerli TLS yapmaz. El sıkışmasından önce SSL katmanında hedef ana bilgisayar adı doğrulamasını ve SNI yapılandırmasını koruyun ve WebSocket yükseltmesine ancak TLS başarılı olduktan sonra başlayın.