Lẹ́yìn tí Beast bá ka àkọlé ìdáhùn CONNECT ti proxy, yẹwò ipò ìdáhùn àti bafa aláìgbé ìgbà yẹn. Iṣẹ́ kíkà lè gbé àwọn byte tó rékọjá òpin àkọlé wá, kí ó sì pa wọ́n mọ́ nínú bafa tí a fún ọ. Bí o bá bẹ̀rẹ̀ TLS pẹ̀lú overload tí ń ka socket nìkan, àwọn byte tí a pa mọ́ yẹn yóò wà níta ọ̀nà ìwọlé TLS.

Fún ìṣàn WebSocket tí ìpele tó kàn ń bọ̀ jẹ́ ìṣàn SSL, lo overload handshake tó ní bafa. Nínú ìpàdé yield_context tó wà tẹ́lẹ̀, kí o máa pa buffer mọ́ láàyè ní gbogbo iṣẹ́:

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);

Àwọn ìpadàbọ̀ àkọ́kọ́ ni àwọn ọ̀nà ìkùnà ìpàdé; so ìròyìn àṣìṣe àti ìmọ́tótó deede mọ́ ibẹ̀. Ìdáhùn CONNECT tó ṣẹ́gun nìkan ni ó ń dá tunnel kalẹ̀. Ojú-ìwé ìkọ̀sílẹ̀ kò gbọdọ̀ di ìwọlé TLS.

Overload tó ní bafa ń parí pẹ̀lú kóòdù àṣìṣe àti iye byte. Iye yẹn ń ṣàlàyé iye byte tó lo láti inú àwọn bafa tí a fún. Lẹ́yìn tí ó bá parí, yọ gangan àkọ́sọ́ yẹn kúrò pẹ̀lú consume(used). Má ṣe sọ bafa di òfo kí iṣẹ́ tó bẹ̀rẹ̀, má ṣe yí ibi ìpamọ́ rẹ̀ padà nígbà tí handshake ń dúró, kí o má sì rò pé iṣẹ́ lo gbogbo byte tí a fún.

Nínú TLS deede tí alábàáṣiṣẹ́pọ̀ bẹ̀rẹ̀ lẹ́sẹ̀kẹsẹ̀ lẹ́yìn CONNECT, bafa lè jẹ́ òfo. Overload ń ṣojú ipò yẹn pẹ̀lú. Èrò rẹ̀ ni láti dáàbò bo ààlà ìṣàn; kò sọ àwọn dátà proxy àìdábọ̀ tó ń bọ̀ di TLS tó wúlò. Pa ìmúdájú orúkọ agbàlejò ibi-ìlọ àti ìṣètò SNI mọ́ lórí ìpele SSL kí handshake tó bẹ̀rẹ̀, kí o sì bẹ̀rẹ̀ ìgbéga WebSocket lẹ́yìn tí TLS bá ṣẹ́gun.

Àwọn àpilẹ̀kọ tó jọra