Након што Beast прочита заглавље CONNECT одговора проксија, проверите и статус одговора и динамички бафер. Операција читања може дохватити бајтове иза завршетка заглавља и задржати их у достављеном баферу. Ако TLS покренете варијантом која чита само сокет, ти задржани бајтови остају изван TLS улазног пута.

За WebSocket ток чији је следећи слој SSL ток, користите баферисану варијанту руковања. У постојећој сесији 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). Не чистите бафер пре почетка операције, не мењајте његово складиште док руковање чека и не претпостављајте да је операција потрошила сваки достављени бајт.

Код обичног TLS-а који клијент покрене одмах након CONNECT-а бафер може бити празан. Варијанта обрађује и тај случај. Њена сврха је очување граница тока; не чини произвољне додатне proxy податке ваљаним TLS-ом. Проверу имена одредишног хоста и SNI конфигурацију држите на SSL слоју пре руковања, а WebSocket надоградњу започните тек након успешног TLS-а.

Повезани чланци