Beast-ek proxy baten CONNECT erantzun-goiburuak irakurri ondoren, egiaztatu erantzunaren egoera eta buffer dinamikoa. Irakurketa eragiketak goiburuaren amaieratik harako byteak ekar ditzake eta emandako bufferrera gorde. Socket-a soilik irakurtzen duen gainkarga batekin TLS hasiz gero, gordetako byte horiek TLS sarrerako bidetik kanpo geratzen dira.

Hurrengo geruza SSL korrontea den WebSocket korronte baterako, erabili bufferra duen eskuko baimenaren gainkarga. Dagoen yield_context saio batean, buffer eragiketa guztietan bizirik mantenduz:

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

Hasierako itzulerak saioaren hutsegite-irteerak dira; han lotu ohiko erroreei buruzko txostena eta garbiketa. CONNECT erantzun arrakastatsu batek soilik ezartzen du tunela. Ukatze-orri bat ez da TLS sarrera bihurtu behar.

Bufferra duen gainkargak errore-kode eta byte-kopuru batekin amaitzen da. Kopuru horrek emandako bufferretatik zenbat byte kontsumitu dituen deskribatzen du. Amaitu ondoren, kendu zehatz-mehatz aurrizki hori consume(used) erabiliz. Ez hustu buffera eragiketa hasi aurretik, ez aldatu bere biltegiratzea eskuko baimena egiteke dagoen bitartean, eta ez suposatu eragiketak emandako byte guztiak kontsumitu dituenik.

CONNECT ondoren berehala bezeroak hasitako TLS arruntean, buffera hutsik egon daiteke. Gainkargak kasu hori ere kudeatzen du. Bere helburua korronte-mugak gordetzea da; ez du proxy datu arbitrarioak TLS baliozkotzat jotzen. Mantendu helmugako ostalari-izenaren egiaztapena eta SNI konfigurazioa SSL geruzan eskuko baimena baino lehen, eta hasi WebSocket bertsio-berritzea TLS arrakastatsua izan ondoren soilik.

Erlazionatutako artikuluak