| 334 | } |
| 335 | |
| 336 | int WebSocket::on_frame_header(websocket_parser* parser) |
| 337 | { |
| 338 | WebSocket* ws = static_cast<WebSocket*>(parser->data); |
| 339 | int opcode = parser->flags & WS_OP_MASK; |
| 340 | |
| 341 | std::unique_lock<std::recursive_mutex> lck(ws->_receivedDataMtx); |
| 342 | auto& message = ws->_receivedData; |
| 343 | |
| 344 | if (opcode != WS_OP_CONTINUE) |
| 345 | ws->_opcode = opcode; |
| 346 | auto length = parser->length; |
| 347 | auto reserve_length = (std::min)(length + 1, static_cast<size_t>(WS_MAX_PAYLOAD_LENGTH)); |
| 348 | if (reserve_length > ws->_receivedData.capacity()) |
| 349 | { |
| 350 | message.reserve(reserve_length); |
| 351 | } |
| 352 | switch (ws->_frameState) |
| 353 | { |
| 354 | case FrameState::BEGIN: |
| 355 | case FrameState::FIN: |
| 356 | message.clear(); |
| 357 | } |
| 358 | ws->_frameState = FrameState::HEADER; |
| 359 | return 0; |
| 360 | } |
| 361 | |
| 362 | int WebSocket::on_frame_body(websocket_parser* parser, const char* at, size_t length) |
| 363 | { |