Després que Beast llegeixi la capçalera de resposta CONNECT d’un proxy, inspecciona tant l’estat de la resposta com el buffer dinàmic. L’operació de lectura pot obtenir bytes més enllà del terminador de la capçalera i retenir-los al buffer subministrat. Si inicies TLS amb una sobrecàrrega que només llegeix el sòcol, aquests bytes retinguts queden fora del camí d’entrada de TLS.

Per a un flux WebSocket la capa següent del qual és el flux SSL, fes servir la sobrecàrrega de handshake amb buffer. En una sessió yield_context existent, amb buffer mantingut viu durant totes les operacions:

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

Els retorns anticipats són les sortides de fallada de la sessió; hi has d’adjuntar la notificació d’errors i la neteja habituals. Només una resposta CONNECT correcta estableix el túnel. Una pàgina de rebuig no ha de convertir-se en entrada de TLS.

La sobrecàrrega amb buffer acaba amb un codi d’error i un recompte de bytes. Aquest recompte indica quants bytes ha consumit dels buffers subministrats. Després de completar-se, elimina exactament aquest prefix amb consume(used). No esborris el buffer abans de començar l’operació, no modifiquis el seu emmagatzematge mentre el handshake està pendent ni assumeixis que l’operació ha consumit tots els bytes subministrats.

Amb el TLS habitual iniciat pel client just després de CONNECT, el buffer pot estar buit. La sobrecàrrega també gestiona aquest cas. La seva finalitat és preservar les fronteres del flux; no converteix dades de proxy arbitràries posteriors en TLS vàlid. Mantingues la verificació del nom d’amfitrió de destinació i la configuració SNI a la capa SSL abans del handshake, i inicia l’actualització a WebSocket només després que TLS reeixi.

Articles relacionats