//----------------------------------------------------------------------------- // ___ __ _ _ // / _ \__ _ _ __ ___ ___ / /(_)_ __ | | __ // / /_)/ _` | '__/ __|/ _ \/ / | | '_ \| |/ / // / ___/ (_| | | \__ \ __/ /__| | | | | < // \/ \__,_|_| |___/\___\____/_|_| |_|_|\_\ . // //----------------------------------------------------------------------------- // Author: Kurt Sassenrath // Module: Server // // Server implementation. Currently, a monolithic server which: // * Communicates with users via TCP (msgpack). // * Runs the websocket server for overlays to read. // // Copyright (c) 2023 Kurt Sassenrath. // // License TBD. //----------------------------------------------------------------------------- #include "parselink/proto/session.h" #include "parselink/logging.h" #include "parselink/msgpack/token.h" using namespace parselink; using namespace parselink::proto; namespace { logging::logger logger("session"); } tl::expected session::parse_header( std::span buffer) noexcept { auto reader = msgpack::token_reader(buffer); auto magic = reader.read_one(); if (!magic || *magic != "prs") { logger.error("Failed to parse magic"); return tl::unexpected(magic ? error::bad_data : error::incomplete); } auto size = reader.read_one().and_then( [](auto t){ return t.template get(); }); if (!size || !*size) { logger.error("Failed to get valid message size"); return tl::unexpected(magic ? error::bad_data : error::incomplete); } if (*size > max_message_size) { logger.error("Message {} exceeds max size {}", *size, max_message_size); return tl::unexpected(error::too_large); } std::uint32_t amt = std::distance(buffer.begin(), reader.current()); return tl::expected(tl::in_place, *size, amt); }