Ar ôl i Beast ddarllen pennawd ymateb CONNECT dirprwy, archwiliwch statws yr ymateb a’r bwfer deinamig ill dau. Gall y llawdriniaeth ddarllen nôl beitiau y tu hwnt i derfynydd y pennawd a’u cadw yn y bwfer a roddwyd. Mae cychwyn TLS â gorlwythiad sy’n darllen y soced yn unig yn gadael y beitiau a gedwir y tu allan i lwybr mewnbwn TLS.

Ar gyfer ffrwd WebSocket y mae ei haen nesaf yn ffrwd SSL, defnyddiwch y gorlwythiad handshake byfferog. Mewn sesiwn yield_context bresennol, gyda buffer yn cael ei gadw’n fyw drwy’r holl lawdriniaethau:

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

Mae’r dychweliadau cynnar yn gynlluniau methiant y sesiwn; atodwch yr adroddiad gwallau arferol a’r glanhau yno. Dim ond ymateb CONNECT llwyddiannus sy’n sefydlu’r twnnel. Rhaid i dudalen wrthod beidio â dod yn fewnbwn TLS.

Mae’r gorlwythiad byfferog yn gorffen â chod gwall a chyfrif beitiau. Mae’r cyfrif hwnnw’n disgrifio faint o feitiau a ddefnyddiodd o’r byfferau a roddwyd. Ar ôl cwblhau, tynnwch yn union y rhagddodiad hwnnw gyda consume(used). Peidiwch â chlirio’r bwfer cyn dechrau’r llawdriniaeth, peidiwch â newid ei storio tra bod y handshake yn disgwyl, ac na thybiwch fod y llawdriniaeth wedi defnyddio pob beit a roddwyd.

Gyda TLS arferol a gychwynnir gan y cleient yn syth ar ôl CONNECT, gall y bwfer fod yn wag. Mae’r gorlwythiad yn trin y cyflwr hwnnw hefyd. Ei bwrpas yw cadw ffiniau ffrwd; nid yw’n gwneud data dirprwy ôl-ddilynol mympwyol yn TLS dilys. Cadwch y gwaith o wirio enw’r lluosogwr cyrchfan a chyfluniad SNI ar haen SSL cyn y handshake, a dechreuwch yr uwchraddiad WebSocket dim ond ar ôl i TLS lwyddo.

Erthyglau cysylltiedig