[Libreoffice-commits] online.git: loolwsd/LOOLProtocol.hpp loolwsd/test
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Sun Oct 23 20:59:05 UTC 2016
loolwsd/LOOLProtocol.hpp | 24 ++++++++++++++++++++++++
loolwsd/test/helpers.hpp | 37 ++++++++++++-------------------------
2 files changed, 36 insertions(+), 25 deletions(-)
New commits:
commit 452888060d73e1283fead168249998ba9d9c757e
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Fri Oct 21 12:59:03 2016 -0400
loolwsd: cleanup and improve getResponseMessage
Proper parsing of incoming messages and better
prefix matching is done, as well as slightly
better logging when we timeout or hit exceptions.
Change-Id: I11adbf24a5505f6cda4a18ba855898dc5f82e238
Reviewed-on: https://gerrit.libreoffice.org/30190
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/loolwsd/LOOLProtocol.hpp b/loolwsd/LOOLProtocol.hpp
index e98d1ea..7fd0f4a 100644
--- a/loolwsd/LOOLProtocol.hpp
+++ b/loolwsd/LOOLProtocol.hpp
@@ -103,6 +103,30 @@ namespace LOOLProtocol
return getFirstToken(message.data(), message.size(), delim);
}
+ inline
+ bool matchPrefix(const std::string& prefix, const std::string& message)
+ {
+ return (message.size() >= prefix.size() &&
+ message.compare(0, prefix.size(), prefix) == 0);
+ }
+
+ inline
+ bool matchPrefix(const std::string& prefix, const std::string& message, const bool ignoreWhitespace)
+ {
+ if (ignoreWhitespace)
+ {
+ const auto posPre = prefix.find_first_not_of(' ');
+ const auto posMsg = message.find_first_not_of(' ');
+
+ return matchPrefix(posPre == std::string::npos ? prefix : prefix.substr(posPre),
+ posMsg == std::string::npos ? message : message.substr(posMsg));
+ }
+ else
+ {
+ return matchPrefix(prefix, message);
+ }
+ }
+
/// Returns true if the token is a user-interaction token.
/// Currently this excludes commands sent automatically.
/// Notice that this doesn't guarantee editing activity,
diff --git a/loolwsd/test/helpers.hpp b/loolwsd/test/helpers.hpp
index cdc7515..cb96a87 100644
--- a/loolwsd/test/helpers.hpp
+++ b/loolwsd/test/helpers.hpp
@@ -186,42 +186,24 @@ std::vector<char> getResponseMessage(Poco::Net::WebSocket& ws, const std::string
int bytes = ws.receiveFrame(response.data(), response.size(), flags);
response.resize(bytes >= 0 ? bytes : 0);
std::cerr << name << "Got " << LOOLProtocol::getAbbreviatedFrameDump(response.data(), bytes, flags) << std::endl;
- auto message = LOOLProtocol::getAbbreviatedMessage(response);
+ const auto message = LOOLProtocol::getFirstLine(response);
if (bytes > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE)
{
- // FIXME: This is wrong in two ways:
-
- // 1) The message variable is the return value from getAbbreviatedMessage(),
- // That is a string that is intended for human-readable logging only. It is not
- // intended to be used for actually decoding the protocol. Sure, at the moment
- // it happens to work, but is still wrong.
-
- // 2) Using std::string::find() like this is silly. If message does not start
- // with prefix, the find() function will search through the whole buffer. That
- // is a waste of cycles. Use the LOOLProtocol functions to manipulate and
- // inspect LOOL protocol frames, that is what they are there
- // for. getFirstToken() should be quite efficient, and it doesn't incur the
- // (potential) overhead of setting up a StringTokenizer. Or, if this is actually
- // used to look for not just a first token, then introduce a startsWith()
- // function.
-
- if (message.find(prefix) == 0)
+ if (LOOLProtocol::matchPrefix(prefix, message))
{
return response;
}
- else if (message.find("nextmessage") == 0)
+ else if (LOOLProtocol::matchPrefix("nextmessage", message))
{
- Poco::StringTokenizer tokens(message, " ", Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
int size = 0;
- if (tokens.count() == 2 &&
- tokens[0] == "nextmessage:" && LOOLProtocol::getTokenInteger(tokens[1], "size", size) && size > 0)
+ if (LOOLProtocol::getTokenIntegerFromMessage(message, "size", size) && size > 0)
{
response.resize(size);
bytes = ws.receiveFrame(response.data(), response.size(), flags);
response.resize(bytes >= 0 ? bytes : 0);
std::cerr << name << "Got " << LOOLProtocol::getAbbreviatedFrameDump(response.data(), bytes, flags) << std::endl;
- message = LOOLProtocol::getAbbreviatedMessage(response);
- if (bytes > 0 && message.find(prefix) == 0)
+ if (bytes > 0 &&
+ LOOLProtocol::matchPrefix(prefix, LOOLProtocol::getFirstLine(response)))
{
return response;
}
@@ -259,10 +241,15 @@ std::vector<char> getResponseMessage(Poco::Net::WebSocket& ws, const std::string
}
}
while (retries > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE);
+
+ if (timedout)
+ {
+ std::cerr << std::endl;
+ }
}
catch (const Poco::Net::WebSocketException& exc)
{
- std::cerr << exc.message();
+ std::cerr << std::endl << exc.message();
}
return std::vector<char>();
More information about the Libreoffice-commits
mailing list