diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index 17b83d1..e1faa81 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -13,7 +13,7 @@ set(TARGET_NAME websocket_server) if (MSVC) add_compile_options(/W4 /WX) else() - add_compile_options(-Wall -Wextra -Wpedantic) + add_compile_options(-Wall -Wextra -Wpedantic -fno-exceptions) if (CMAKE_BUILD_TYPE MATCHES "Debug|RelWithDebInfo") add_compile_options( -fsanitize=address,undefined diff --git a/backend/src/AuthManager.cpp b/backend/src/AuthManager.cpp index 3f7056b..7504e88 100644 --- a/backend/src/AuthManager.cpp +++ b/backend/src/AuthManager.cpp @@ -4,7 +4,8 @@ AuthManager::AuthManager() { credentials_ = { {"shashwat", "shashwat"}, - {"nero", "nero"} + {"nero", "nero"}, + {"test", "test"} }; }; // clang-format on diff --git a/backend/src/WebSocketServer.cpp b/backend/src/WebSocketServer.cpp index e3ba36e..ad4908e 100644 --- a/backend/src/WebSocketServer.cpp +++ b/backend/src/WebSocketServer.cpp @@ -1,5 +1,6 @@ #include "include/WebSocketServer.hpp" #include "include/MarketData.hpp" +#include #include #include #include @@ -108,20 +109,22 @@ void WebSocketServer::on_message(WebSocket *ws, std::string_view message, SocketData *user = ws->getUserData(); if (!message.empty() && std::all_of(message.begin(), message.end(), ::isdigit)) { - try { - auto server_timestamp = - std::chrono::duration_cast( - std::chrono::system_clock::now().time_since_epoch()) - .count(); - long long client_timestamp = std::stoll(std::string(message)); - long long diff = server_timestamp - client_timestamp; - std::println("[LOG]: server: {} client: {} diff: {}", - server_timestamp, client_timestamp, diff); - - } catch (const std::exception &e) { - std::println(stderr, "Recieved a non-timestamp message: {} ", + long long client_timestamp{}; + // https://en.cppreference.com/cpp/utility/from_chars + auto [ptr, ec] = std::from_chars( + message.data(), message.data() + message.size(), client_timestamp); + if (ec != std::errc{}) { + std::println(stderr, "Received a non-timestamp message: {}", message); + return; } + auto server_timestamp = + std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()) + .count(); + long long diff = server_timestamp - client_timestamp; + std::println("[LOG]: server: {} client: {} diff: {}", server_timestamp, + client_timestamp, diff); return; } @@ -136,21 +139,26 @@ void WebSocketServer::on_message(WebSocket *ws, std::string_view message, return MessageType::UNKNOWN; }; - try { - json msg = json::parse(message); - std::string type = msg.value("type", ""); - MessageType mtype = message_type_from_string(type); - if (mtype != MessageType::LOGIN && !user->is_authenticated) { - ws->send(R"({"type":"error","message":"not_authenticated"})", - uWS::OpCode::TEXT); - return; - } + json msg = json::parse(message, nullptr, false); + if (msg.is_discarded()) { + std::println("[Error] Invalid JSON:"); + ws->send(R"({"type":"error","message":"invalid_json"})", + uWS::OpCode::TEXT); + return; + } + std::string type = msg.value("type", ""); + MessageType mtype = message_type_from_string(type); + if (mtype != MessageType::LOGIN && !user->is_authenticated) { + ws->send(R"({"type":"error","message":"not_authenticated"})", + uWS::OpCode::TEXT); + return; + } - /* - * TODO: class with virtual handler function would be the best choice - * for this :)" - */ - // clang-format off + /* + * TODO: class with virtual handler function would be the best choice + * for this :)" + */ + // clang-format off switch (mtype) { case MessageType::LOGIN: { LoginHandler(this, ws, user, msg); @@ -171,12 +179,7 @@ void WebSocketServer::on_message(WebSocket *ws, std::string_view message, break; } } - // clang-format on - } catch (const std::exception &e) { - std::println("[Error] Invalid JSON:{}", e.what()); - ws->send(R"({"type":"error","message":"invalid_json"})", - uWS::OpCode::TEXT); - } + // clang-format on } void WebSocketServer::on_close(WebSocket * /*ws*/, int /*code*/, diff --git a/backend/src/main.cpp b/backend/src/main.cpp index a1888e5..269193c 100644 --- a/backend/src/main.cpp +++ b/backend/src/main.cpp @@ -3,15 +3,8 @@ int main() { constexpr int listen_port = 7000; - try { - WebSocketServer server(listen_port, "../certs/key.pem", - "../certs/cert.pem"); - server.run(); - } catch (const std::exception &e) { - std::cerr << "An unhandled exception occurred: " << e.what() - << std::endl; - return 1; - } - + WebSocketServer server(listen_port, "../certs/key.pem", + "../certs/cert.pem"); + server.run(); return 0; }