From 8db5ff97ffe34aa42f71b5c8aebfa0878e5fde89 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 4 Jul 2020 16:58:08 +0200 Subject: Add error message support and reporting on all commands. --- src/messageparser.cc | 119 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 96 insertions(+), 23 deletions(-) (limited to 'src/messageparser.cc') diff --git a/src/messageparser.cc b/src/messageparser.cc index 7393c5c..b0a2a6f 100644 --- a/src/messageparser.cc +++ b/src/messageparser.cc @@ -30,6 +30,7 @@ #include #include #include +#include #include @@ -156,7 +157,8 @@ static nodeid_t getId(std::map &sym, std::string token) inline static void create_msg_list(MsgTokensList& msgTokensList, MessageList& msgList, - bool clientmode) + bool clientmode, + struct lws* wsi) { size_t origin = 0; if(clientmode) @@ -174,6 +176,8 @@ inline static void create_msg_list(MsgTokensList& msgTokensList, //malformed msg if(t.size() < origin+1) { + msgList.push_back(create_msg_error(ErrorCode::Unknown, + "malformed message", wsi)); continue; } @@ -192,7 +196,13 @@ inline static void create_msg_list(MsgTokensList& msgTokensList, else if(t[origin] == "remove") m.cmd = cmd::remove; else if(t[origin] == "move") m.cmd = cmd::move; else if(t[origin] == "update") m.cmd = cmd::update; - else m.cmd = cmd::error; + else if(t[origin] == "error") m.cmd = cmd::error; + else + { + msgList.push_back(create_msg_error(ErrorCode::Unknown, + "unknown command", wsi)); + continue; + } switch(m.cmd) { @@ -200,7 +210,9 @@ inline static void create_msg_list(MsgTokensList& msgTokensList, { if(t.size() != origin+1+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); + msgList.push_back( + create_msg_error(ErrorCode::WrongNumberOfArguments, + "Wrong number of arguments.", wsi)); continue; } m.subscribe.id = getId(sym, t[origin+1]); @@ -211,7 +223,9 @@ inline static void create_msg_list(MsgTokensList& msgTokensList, { if(t.size() != origin+1+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); + msgList.push_back( + create_msg_error(ErrorCode::WrongNumberOfArguments, + "Wrong number of arguments.", wsi)); continue; } m.unsubscribe.id = getId(sym, t[origin+1]); @@ -223,7 +237,9 @@ inline static void create_msg_list(MsgTokensList& msgTokensList, { if(t.size() != origin+1+2) { - DEBUG(msgparser, "Wrong number of parameters\n"); + msgList.push_back( + create_msg_error(ErrorCode::WrongNumberOfArguments, + "Wrong number of arguments.", wsi)); continue; } m.login.user = t[origin+1]; @@ -235,23 +251,27 @@ inline static void create_msg_list(MsgTokensList& msgTokensList, case cmd::logout: if(t.size() != origin+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); + msgList.push_back( + create_msg_error(ErrorCode::WrongNumberOfArguments, + "Wrong number of arguments.", wsi)); continue; } break; + case cmd::create_with_attributes: + // Never sent to the server + break; + case cmd::create: { - if(!clientmode && t.size() != origin+1+2+1) + if(t.size() != origin+1+2+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - if(clientmode && t.size() != origin+1+2+1) - { - DEBUG(msgparser, "Wrong number of parameters\n"); + msgList.push_back( + create_msg_error(ErrorCode::WrongNumberOfArguments, + "Wrong number of arguments.", wsi)); continue; } + if(clientmode) { m.create.id = getId(sym, t[origin+1]); @@ -264,23 +284,29 @@ inline static void create_msg_list(MsgTokensList& msgTokensList, m.create.parentid = getId(sym, t[origin+2]); m.create.insertbeforeid = getId(sym, t[origin+3]); } - break; } + break; + case cmd::remove: { if(t.size() != origin+1+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); + msgList.push_back( + create_msg_error(ErrorCode::WrongNumberOfArguments, + "Wrong number of arguments.", wsi)); continue; } m.remove.id = getId(sym, t[origin+1]); } break; + case cmd::move: { if(t.size() != origin+2+1+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); + msgList.push_back( + create_msg_error(ErrorCode::WrongNumberOfArguments, + "Wrong number of arguments.", wsi)); continue; } m.move.id = getId(sym, t[origin+1]); @@ -288,11 +314,14 @@ inline static void create_msg_list(MsgTokensList& msgTokensList, m.move.insertbeforeid = getId(sym, t[origin+3]); } break; + case cmd::update: { if(t.size() != origin+3+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); + msgList.push_back( + create_msg_error(ErrorCode::WrongNumberOfArguments, + "Wrong number of arguments.", wsi)); continue; } m.update.id = getId(sym, t[origin+1]); @@ -300,14 +329,27 @@ inline static void create_msg_list(MsgTokensList& msgTokensList, m.update.value = t[origin+3]; } break; - default: + + case cmd::error: + { + if(t.size() != origin+2+1) + { + msgList.push_back( + create_msg_error(ErrorCode::WrongNumberOfArguments, + "Wrong number of arguments.", wsi)); + continue; + } + m.error.code = static_cast(atoi(t[origin+1].data())); + m.error.msg = t[origin+2]; + } break; }; + msgList.push_back(m); } } -MessageList parse_msg(std::string data) +MessageList parse_msg(std::string data, struct lws* wsi) { DEBUG(msgparser, "Parsing: '%s'\n", data.c_str()); @@ -315,19 +357,19 @@ MessageList parse_msg(std::string data) parse_into_msg_tokens(data, msgTokensList); MessageList msgList; - create_msg_list(msgTokensList, msgList, false); + create_msg_list(msgTokensList, msgList, false, wsi); return msgList; } -MessageList parse_msg_client(std::string data) +MessageList parse_msg_client(std::string data, struct lws* wsi) { DEBUG(msgparser, "Parsing: '%s'\n", data.c_str()); MsgTokensList msgTokensList; parse_into_msg_tokens(data, msgTokensList); MessageList msgList; - create_msg_list(msgTokensList, msgList, true); + create_msg_list(msgTokensList, msgList, true, wsi); return msgList; } @@ -392,7 +434,18 @@ std::vector msg_tostring(message_t m) m.update.attribute + "\" \"" + m.update.value + "\";"; msgs.push_back(msg); break; - default: + case cmd::error: + msg = "error " + + std::to_string(static_cast(m.error.code)) + " \"" + + m.error.msg + "\";"; + msgs.push_back(msg); + break; + case cmd::login: + case cmd::logout: + case cmd::subscribe: + case cmd::unsubscribe: + assert(false); + // The server never sends these messages so no need to serialise them. break; } @@ -444,3 +497,23 @@ message_t create_msg_move(nodeid_t id, nodeid_t to, nodeid_t insertbeforeid) m.move.insertbeforeid = insertbeforeid; return m; } + +message_t create_msg_error(ErrorCode code, const std::string &msg, + struct lws* wsi) +{ + message_t m; + m.cmd = cmd::error; + m.error.wsi = wsi; + m.error.code = code; + m.error.msg = msg; + return m; +} + +message_t create_msg_error(const ErrorMessage &error, struct lws* wsi) +{ + message_t m; + m.cmd = cmd::error; + m.error = error; + m.error.wsi = wsi; + return m; +} -- cgit v1.2.3