Beast-in CONNECT buferini TLS handshake-ə daşıyın
CONNECT cavabından sonra saxlanılan baytları Asio-nun buferli TLS handshake-inə ötürün, sonra istifadə etdiyi həcmi dəqiq istehlak edin.
Beast proksinin CONNECT cavab başlığını oxuduqdan sonra həm cavab statusunu, həm də dinamik buferi yoxlayın. Oxuma əməliyyatı başlığın sonundan kənar baytları gətirə və verilən buferdə saxlaya bilər. TLS-i yalnız soketi oxuyan variantla başlatmaq həmin saxlanılan baytları TLS giriş yolundan kənarda qoyur.
Növbəti qatı SSL axını olan WebSocket axını üçün buferli handshake variantından istifadə edin. Mövcud yield_context sessiyasında buffer əməliyyatlar boyu canlı saxlanılmaqla:
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);
Erkən qayıdışlar sessiyanın uğursuzluq çıxışlarını təmsil edir; adi xəta bildirişini və təmizləməni orada birləşdirin. Tüneli yalnız uğurlu CONNECT cavabı qurur. Rədd səhifəsi TLS girişinə çevrilməməlidir.
Buferli variant xəta kodu və bayt sayı ilə tamamlanır. Bu say verilən buferlərdən nə qədər bayt istehlak etdiyini bildirir. Tamamlandıqdan sonra həmin prefiksi consume(used) ilə dəqiq silin. Əməliyyatdan əvvəl buferi təmizləməyin, handshake gözləyərkən yaddaşını dəyişməyin və əməliyyatın verilən hər baytı istehlak etdiyini güman etməyin.
CONNECT-dən dərhal sonra müştərinin başlatdığı adi TLS-də bufer boş ola bilər. Variant bu halı da idarə edir. Məqsədi axın sərhədlərini qorumaqdır; ixtiyari sonrakı proksi məlumatını etibarlı TLS etmir. Handshake-dən əvvəl SSL qatında təyinat host adı yoxlamasını və SNI konfiqurasiyasını saxlayın, WebSocket yüksəltməsini yalnız TLS uğurlu olduqdan sonra başladın.