58 lines
1.9 KiB
C++
58 lines
1.9 KiB
C++
//-----------------------------------------------------------------------------
|
|
// ___ __ _ _
|
|
// / _ \__ _ _ __ ___ ___ / /(_)_ __ | | __
|
|
// / /_)/ _` | '__/ __|/ _ \/ / | | '_ \| |/ /
|
|
// / ___/ (_| | | \__ \ __/ /__| | | | | <
|
|
// \/ \__,_|_| |___/\___\____/_|_| |_|_|\_\ .
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
// 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<header_info, error> session::parse_header(
|
|
std::span<std::byte const> 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<std::uint32_t>(); });
|
|
|
|
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<header_info, error>(tl::in_place, *size, amt);
|
|
}
|