[Libreoffice-commits] online.git: loolwsd/Common.hpp loolwsd/DocumentBroker.hpp loolwsd/LOOLKit.cpp loolwsd/LOOLSession.cpp loolwsd/Util.cpp loolwsd/Util.hpp

Jan Holesovsky kendy at collabora.com
Tue Nov 8 17:29:32 UTC 2016


 loolwsd/Common.hpp         |    5 -----
 loolwsd/DocumentBroker.hpp |    2 ++
 loolwsd/LOOLKit.cpp        |   30 ++++--------------------------
 loolwsd/LOOLSession.cpp    |   17 ++---------------
 loolwsd/Util.cpp           |   20 ++++++++++++++++++++
 loolwsd/Util.hpp           |   10 ++++++++++
 6 files changed, 38 insertions(+), 46 deletions(-)

New commits:
commit 5f6858f7821471bd188764d52a84df39376e742e
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Nov 8 18:19:15 2016 +0100

    Factor out creation of nextmessage: and improve its logging.
    
    Change-Id: I552bc2599835b4f6c9d4ef423889b464c5701221

diff --git a/loolwsd/Common.hpp b/loolwsd/Common.hpp
index cfe0e2d..686b556 100644
--- a/loolwsd/Common.hpp
+++ b/loolwsd/Common.hpp
@@ -27,11 +27,6 @@ constexpr int WS_SEND_TIMEOUT_MS = 1000;
 /// Should be large enough for ethernet packets
 /// which can be 1500 bytes long.
 constexpr int READ_BUFFER_SIZE = 2048;
-/// Size after which messages will be sent preceded with
-/// 'nextmessage' frame to let the receiver know in advance
-/// the size of larger coming message. All messages up to this
-/// size are considered small messages.
-constexpr int SMALL_MESSAGE_SIZE = READ_BUFFER_SIZE / 2;
 
 constexpr auto JAILED_DOCUMENT_ROOT = "/user/docs/";
 constexpr auto CHILD_URI = "/loolws/child?";
diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp
index 34195c9..2b0f162 100644
--- a/loolwsd/DocumentBroker.hpp
+++ b/loolwsd/DocumentBroker.hpp
@@ -150,6 +150,8 @@ public:
             {
                 // We don't care about the response (and shouldn't read here).
                 _ws->sendFrame("PING", 4, Poco::Net::WebSocket::FRAME_OP_PING);
+                LOG_DBG("Sent a PING.");
+
                 return true;
             }
         }
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index c97f247..52510ab 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -504,15 +504,8 @@ public:
             return;
         }
 
-        const auto length = output.size();
-        if (length > SMALL_MESSAGE_SIZE)
-        {
-            const std::string nextmessage = "nextmessage: size=" + std::to_string(length);
-            ws->sendFrame(nextmessage.data(), nextmessage.size());
-        }
-
-        LOG_TRC("Sending render-tile response (" << length << " bytes) for: " << response);
-        ws->sendFrame(output.data(), length, WebSocket::FRAME_BINARY);
+        LOG_TRC("Sending render-tile response (" + std::to_string(output.size()) + " bytes) for: " + response);
+        Util::sendLargeFrame(ws, output, WebSocket::FRAME_BINARY);
     }
 
     void renderCombinedTiles(StringTokenizer& tokens, const std::shared_ptr<Poco::Net::WebSocket>& ws)
@@ -612,14 +605,7 @@ public:
         std::copy(tileMsg.begin(), tileMsg.end(), response.begin());
         std::copy(output.begin(), output.end(), response.begin() + tileMsg.size());
 
-        const auto length = response.size();
-        if (length > SMALL_MESSAGE_SIZE)
-        {
-            const std::string nextmessage = "nextmessage: size=" + std::to_string(length);
-            ws->sendFrame(nextmessage.data(), nextmessage.size());
-        }
-
-        ws->sendFrame(response.data(), length, WebSocket::FRAME_BINARY);
+        Util::sendLargeFrame(ws, response, WebSocket::FRAME_BINARY);
     }
 
     bool sendTextFrame(const std::string& message) override
@@ -632,15 +618,7 @@ public:
                 return false;
             }
 
-            const auto length = message.size();
-            if (length > SMALL_MESSAGE_SIZE)
-            {
-                const std::string nextmessage = "nextmessage: size=" + std::to_string(length);
-                LOG_TRC("Sending large message [" << nextmessage << "].");
-                _ws->sendFrame(nextmessage.data(), nextmessage.size());
-            }
-
-            _ws->sendFrame(message.data(), length);
+            Util::sendLargeFrame(_ws, message.data(), message.size());
             return true;
         }
         catch (const Exception& exc)
diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp
index d671066..c281adc 100644
--- a/loolwsd/LOOLSession.cpp
+++ b/loolwsd/LOOLSession.cpp
@@ -84,14 +84,7 @@ bool LOOLSession::sendTextFrame(const char* buffer, const int length)
             return false;
         }
 
-        if (length > SMALL_MESSAGE_SIZE)
-        {
-            const std::string nextmessage = "nextmessage: size=" + std::to_string(length);
-            LOG_TRC("Sending large message [" << nextmessage << "].");
-            _ws->sendFrame(nextmessage.data(), nextmessage.size());
-        }
-
-        _ws->sendFrame(buffer, length);
+        Util::sendLargeFrame(_ws, buffer, length);
         return true;
     }
     catch (const Exception& exc)
@@ -116,13 +109,7 @@ bool LOOLSession::sendBinaryFrame(const char *buffer, int length)
             return false;
         }
 
-        if (length > SMALL_MESSAGE_SIZE)
-        {
-            const std::string nextmessage = "nextmessage: size=" + std::to_string(length);
-            _ws->sendFrame(nextmessage.data(), nextmessage.size());
-        }
-
-        _ws->sendFrame(buffer, length, WebSocket::FRAME_BINARY);
+        Util::sendLargeFrame(_ws, buffer, length, WebSocket::FRAME_BINARY);
         return true;
     }
     catch (const Exception& exc)
diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp
index 1b9a63c..deaee45 100644
--- a/loolwsd/Util.cpp
+++ b/loolwsd/Util.cpp
@@ -46,6 +46,7 @@
 #include <Poco/Util/Application.h>
 
 #include "Common.hpp"
+#include "LOOLProtocol.hpp"
 #include "Log.hpp"
 #include "Util.hpp"
 
@@ -563,6 +564,25 @@ namespace Util
         static std::atomic_int counter(0);
         return std::to_string(Poco::Process::id()) + "/" + std::to_string(counter++);
     }
+
+    void sendLargeFrame(const std::shared_ptr<Poco::Net::WebSocket>& ws, const char *message, int length, int flags)
+    {
+        // Size after which messages will be sent preceded with
+        // 'nextmessage' frame to let the receiver know in advance
+        // the size of larger coming message. All messages up to this
+        // size are considered small messages.
+        constexpr int SMALL_MESSAGE_SIZE = READ_BUFFER_SIZE / 2;
+
+        if (length > SMALL_MESSAGE_SIZE)
+        {
+            const std::string nextmessage = "nextmessage: size=" + std::to_string(length);
+            ws->sendFrame(nextmessage.data(), nextmessage.size());
+            Log::debug("Message is long, sent " + nextmessage);
+        }
+
+        ws->sendFrame(message, length, flags);
+        Log::debug("Sent frame: " + LOOLProtocol::getAbbreviatedMessage(std::string(message, length)));
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loolwsd/Util.hpp b/loolwsd/Util.hpp
index cde7828..462d542 100644
--- a/loolwsd/Util.hpp
+++ b/loolwsd/Util.hpp
@@ -178,6 +178,16 @@ namespace Util
         return s;
     }
 
+    /// Send frame.  If it is too long, send a 'nextmessage:' before the real
+    /// frame.
+    void sendLargeFrame(const std::shared_ptr<Poco::Net::WebSocket>& ws, const char *message, int length, int flags = Poco::Net::WebSocket::FRAME_TEXT);
+
+    /// Send frame as above, the std::string variant.
+    inline void sendLargeFrame(const std::shared_ptr<Poco::Net::WebSocket>& ws, const std::vector<char> &message, int flags = Poco::Net::WebSocket::FRAME_TEXT)
+    {
+        sendLargeFrame(ws, message.data(), message.size(), flags);
+    }
+
     /// Given one or more patterns to allow, and one or more to deny,
     /// the match member will return true if, and only if, the subject
     /// matches the allowed list, but not the deny.


More information about the Libreoffice-commits mailing list