diff --git a/include/parselink/BUILD b/include/parselink/BUILD index b93df59..6dc630a 100644 --- a/include/parselink/BUILD +++ b/include/parselink/BUILD @@ -11,7 +11,7 @@ cc_library( name = "logging", hdrs = glob(["logging.h", "logging/**/*.h"]), includes = ["."], - deps = ["@fmt", "@magic_enum", "//include:path"], + deps = ["@fmt", "@magic_enum", "@expected", "//include:path"], visibility = ["//visibility:public"], ) diff --git a/include/parselink/logging/formatters.h b/include/parselink/logging/formatters.h index 886530c..a489eef 100644 --- a/include/parselink/logging/formatters.h +++ b/include/parselink/logging/formatters.h @@ -23,7 +23,7 @@ #include "traits.h" #include "theme.h" -/* #include */ +#include #include @@ -105,25 +105,25 @@ struct fmt::formatter : fmt::formatter { } }; -#if 0 // TODO(ksassenrath): Re-enable when expected has been integrated template -struct fmt::formatter> { +struct fmt::formatter> { template constexpr auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { return ctx.begin(); } template - auto format(parselink::expected const& v, FormatContext& ctx) const { - if (v.has_value()) { - return fmt::format_to(ctx.out(), "{}", parselink::logging::format_arg{v.value()}); + auto format(tl::expected const& v, FormatContext& ctx) const { + if (v) { + return fmt::format_to(ctx.out(), "{}", + parselink::logging::format_arg{v.value()}); } else { - return fmt::format_to(ctx.out(), "{}", parselink::logging::format_arg{v.error()}); + return fmt::format_to(ctx.out(), "{}", + parselink::logging::format_arg{v.error()}); } } }; -#endif // Support format_arg wrappers, which will be used to colorize output. template diff --git a/include/parselink/logging/theme.h b/include/parselink/logging/theme.h index cfac7f6..6d6adcf 100644 --- a/include/parselink/logging/theme.h +++ b/include/parselink/logging/theme.h @@ -32,7 +32,7 @@ #include "level.h" #include "traits.h" -/* #include */ +#include #include @@ -154,19 +154,12 @@ constexpr auto get_theme(T const& value) { return out; } -#if 0 -// TODO(ksassenrath): Enable when expected is supported template -struct theme> { +struct theme> { static constexpr auto style(auto const& e) noexcept { - if (e.has_value()) { - return get_theme(e.value()); - } else { - return get_theme(e.error()); - } + return e ? get_theme(e.value()) : get_theme(e.error()); } }; -#endif template struct themed_arg : format_arg {}; diff --git a/include/parselink/msgpack/token/reader.h b/include/parselink/msgpack/token/reader.h index 808878c..8cc8f11 100644 --- a/include/parselink/msgpack/token/reader.h +++ b/include/parselink/msgpack/token/reader.h @@ -143,6 +143,10 @@ public: return std::next(data_.begin(), curr_); } + constexpr auto end() const noexcept { + return data_.end(); + } + constexpr auto remaining(auto itr) noexcept { using dist_type = decltype(std::distance(itr, data_.end())); return std::max(dist_type(0), std::distance(itr, data_.end())); diff --git a/source/server.cpp b/source/server.cpp index dfd1509..3f12098 100644 --- a/source/server.cpp +++ b/source/server.cpp @@ -21,7 +21,7 @@ #include "parselink/logging.h" #include "parselink/server.h" -#include "parselink/proto/message.h" +#include "parselink/msgpack/token/reader.h" #include #include @@ -93,6 +93,10 @@ namespace { constexpr auto no_ex_defer = net::as_tuple(deferred); } +struct msgbuf { + std::vector payload; +}; + class user_session : public std::enable_shared_from_this { public: user_session(net::ip::tcp::socket sock) : socket_(std::move(sock)) {} @@ -103,20 +107,44 @@ public: void start() { logger.debug("New connection from {}", socket_.remote_endpoint()); co_spawn(socket_.get_executor(), [self = shared_from_this()]{ - return self->reader(); + return self->await_auth(); }, detached); } - awaitable reader() { - std::array buffer; + awaitable await_auth() { + std::array buffer; auto [ec, n] = co_await socket_.async_read_some( net::buffer(buffer), no_ex_coro); if (ec) { logger.error("Reading from user socket failed: {}", ec); co_return; } - logger.info("Read {} bytes from client: {}", n, + logger.debug("Read {} bytes from client: {}", n, std::string_view(reinterpret_cast(buffer.data()), n)); + + // TODO(ksassenrath): Clean this part up. This could be handled in its + // own read_message_header() method. + auto reader = msgpack::token_reader(std::span(buffer.data(), n)); + auto magic = reader.read_one().map( + [](auto t){ return t == std::string_view{"prs"}; }); + if (magic && *magic) { + logger.debug("Got magic from client"); + } else { + logger.debug("Got error from client: {}", magic); + co_return; + } + auto sz = reader.read_one().and_then( + [](auto t){ return t.template get(); }); + if (sz && *sz) { + logger.debug("Got packet size from client: {}", *sz); + } else { + logger.debug("Got error from client: {}", sz); + co_return; + } + // Copy the rest of the message to the buffer for parsing. + std::vector msg(*sz); + std::copy(reader.current(), reader.end(), msg.begin()); + //auto [ec, n] = co_await socket_.async_read_some(net::buffer()); } enum class state { @@ -153,7 +181,7 @@ monolithic_server::monolithic_server(std::string_view address, , user_port_{user_port} , websocket_port_{websocket_port} { logger.debug("Creating monolithic_server(address = {}, user_port = {}, " - "websocket_port = {}, sizeof(message) = {})", address, user_port_, websocket_port_, sizeof(proto::message)); + "websocket_port = {})", address, user_port_, websocket_port_); } awaitable monolithic_server::user_listen() {