[Libreoffice-commits] online.git: loolwsd/LOOLWebSocket.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Mon Nov 14 05:21:14 UTC 2016


 loolwsd/LOOLWebSocket.hpp |   26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

New commits:
commit 3cff7993019d10e7c11a3d9dd67ba760dcc061b8
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sat Nov 12 13:41:16 2016 -0500

    loolwsd: Log error when not sending full frame
    
    ... and timeout when receiving frame.
    
    Change-Id: I5bb085f494fc146f7fbd75be3f3bb86597029369
    Reviewed-on: https://gerrit.libreoffice.org/30818
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/LOOLWebSocket.hpp b/loolwsd/LOOLWebSocket.hpp
index 212990a..672b93a 100644
--- a/loolwsd/LOOLWebSocket.hpp
+++ b/loolwsd/LOOLWebSocket.hpp
@@ -51,9 +51,12 @@ public:
     // Wrapper for LOOLWebSocket::receiveFrame() that handles PING frames (by replying with a
     // PONG frame) and PONG frames. PONG frames are ignored.
     // Should we also factor out the handling of non-final and continuation frames into this?
-    int receiveFrame(char* buffer, int length, int& flags)
+    int receiveFrame(char* buffer, const int length, int& flags)
     {
-        for (;;)
+        // Timeout given is in microseconds.
+        static const Poco::Timespan waitTime(POLL_TIMEOUT_MS * 1000);
+
+        while (poll(waitTime, Poco::Net::Socket::SELECT_READ))
         {
             const int n = Poco::Net::WebSocket::receiveFrame(buffer, length, flags);
             if ((flags & WebSocket::FRAME_OP_BITMASK) == WebSocket::FRAME_OP_PING)
@@ -78,9 +81,9 @@ public:
     /// It would be a kind of more natural to encapsulate Poco::Net::WebSocket
     /// instead of inheriting (from that reason), but that would requite much
     /// larger code changes.
-    int sendFrame(const void * buffer, int length, int flags = FRAME_TEXT)
+    int sendFrame(const char* buffer, const int length, const int flags = FRAME_TEXT)
     {
-        std::lock_guard<std::mutex> lock(_mutex);
+        std::unique_lock<std::mutex> lock(_mutex);
 
         // Size after which messages will be sent preceded with
         // 'nextmessage' frame to let the receiver know in advance
@@ -95,8 +98,19 @@ public:
             Log::debug("Message is long, sent " + nextmessage);
         }
 
-        int result = Poco::Net::WebSocket::sendFrame(buffer, length, flags);
-        Log::debug("Sent frame: " + LOOLProtocol::getAbbreviatedMessage(static_cast<const char*>(buffer), length));
+        const int result = Poco::Net::WebSocket::sendFrame(buffer, length, flags);
+
+        lock.unlock();
+
+        if (result != length)
+        {
+            LOG_ERR("Sent incomplete message, expected " << length << " bytes but sent " << result <<
+                    " while sending: " << LOOLProtocol::getAbbreviatedMessage(buffer, length));
+        }
+        else
+        {
+            LOG_DBG("Sent frame: " << LOOLProtocol::getAbbreviatedMessage(buffer, length));
+        }
 
         return result;
     }


More information about the Libreoffice-commits mailing list