פירן דעם CONNECT בופער פון Beast אריין אין TLS handshake
גיב איבער די בייטן וואס בלײַבן נאך א CONNECT ענטפער צו Asio’ס געפּאַפערטע TLS handshake, און דערנאך פאַרניץ פּונקט די מאָס וואָס ער האָט גענוצט.
נאָך דעם וואָס Beast לייענט דעם CONNECT ענטפער קעפּל פון אַ פּראָקסי, פּרוף סיי דעם ענטפער סטאַטוס און סיי דעם דינאַמישן בופער. די לייען אָפּעראַציע קען ברענגען בייטן אַריבער דעם קעפּל סוף און זיי האַלטן אין דעם געגעבענעם בופער. אויב איר אָנהייבט TLS מיט אַן איבערלאָדונג וואָס לייענט נאָר דעם סאָקעט, בלײַבן די געהאַלטענע בייטן אינדרויסן פון TLS אריינקום וועג.
פֿאַר אַ WebSocket שטראָם וועמענס קומענדיקע שיכט איז די SSL שטראָם, ניצט די געפּאַפערטע handshake איבערלאָדונג. אין אַ באַשטייענדיקער 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). ליידיק נישט אויס דעם בופער פֿאַר דער אָפּעראַציע הייבט אָן, ענדערט נישט זײַן לאַגער בשעת די handshake וואַרט, און רעכנט נישט אַז די אָפּעראַציע האָט פֿאַרניצט יעדע געגעבענע בייט.
ביי געוויינטלעכער קליענט-אָנגעהויבענער TLS גלײַך נאָך CONNECT קען דער בופער זײַן ליידיק. די איבערלאָדונג באַהאַנדלט אויך דעם פֿאַל. איר צוועק איז צו באַוואָרען שטראָם גרענעצן; זי מאַכט נישט קיין באַליבטן נאָכפֿאָלגנדיקן פּראָקסי דאַטן פֿאַר גילטיקער TLS. האַלט די ציל האָסט נאָמען וועריפֿיקאַציע און SNI קאָנפֿיגוראַציע אויף דער SSL שיכט פֿאַר דער handshake, און אָנהייבט דעם WebSocket אויפֿבויאונג נאָר נאָך דעם וואָס TLS איז דערפֿאָלגרייך.