[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2020-09-17 Thread Ashod Nakashian (via logerrit)
 net/WebSocketHandler.hpp |   22 +++---
 1 file changed, 7 insertions(+), 15 deletions(-)

New commits:
commit 4c954973273624f80d92cf6190ea064bac41bdb9
Author: Ashod Nakashian 
AuthorDate: Thu Sep 17 07:54:00 2020 -0400
Commit: Andras Timar 
CommitDate: Thu Sep 17 15:37:21 2020 +0200

wsd: allow pings from clients

Per the rfc (https://tools.ietf.org/html/rfc6455#section-5.5.2):
"An endpoint MAY send a Ping frame any time after the connection
is established and before the connection is closed."

And "Upon receipt of a Ping frame, an endpoint MUST send a Pong
frame in response, unless it already received a Close frame."

Here we allow for pings to come from clients and we respond
to them by pongs, as required by rfc 6455.

Change-Id: I8e285f095526e4b67373ecb3ae1efc9c8717d756
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/102948
Tested-by: Jenkins CollaboraOffice 
Reviewed-by: Andras Timar 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 7fb38c86d..7a9ec902c 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -287,33 +287,25 @@ public:
 switch (code)
 {
 case WSOpCode::Pong:
-if (_isClient)
-{
-LOG_ERR('#' << socket->getFD() << ": Servers should not 
send pongs, only clients");
-shutdown(StatusCodes::POLICY_VIOLATION);
-return true;
-}
-else
 {
+if (_isClient)
+LOG_WRN('#' << socket->getFD() << ": Servers should 
not send pongs, only clients");
+
 _pingTimeUs = 
std::chrono::duration_cast
 (std::chrono::steady_clock::now() - 
_lastPingSentTime).count();
 LOG_TRC('#' << socket->getFD() << ": Pong received: " << 
_pingTimeUs << " microseconds");
 }
 break;
 case WSOpCode::Ping:
-if (_isClient)
 {
-auto now = std::chrono::steady_clock::now();
+if (!_isClient)
+LOG_ERR('#' << socket->getFD() << ": Clients should 
not send pings, only servers");
+
+const auto now = std::chrono::steady_clock::now();
 _pingTimeUs = 
std::chrono::duration_cast
 (now - _lastPingSentTime).count();
 sendPong(now, &ctrlPayload[0], payloadLen, socket);
 }
-else
-{
-LOG_ERR('#' << socket->getFD() << ": Clients should not 
send pings, only servers");
-shutdown(StatusCodes::POLICY_VIOLATION);
-return true;
-}
 break;
 case WSOpCode::Close:
 {
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2020-07-14 Thread Michael Meeks (via logerrit)
 net/WebSocketHandler.hpp |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit 7336133319881161907cbba2fcbfebf09b95c6a8
Author: Michael Meeks 
AuthorDate: Tue Jul 14 10:44:21 2020 +0100
Commit: Michael Meeks 
CommitDate: Tue Jul 14 16:59:51 2020 +0200

Handle multiple queued fragments in WebSocket _inBuffer without timeout.

Change-Id: I488a1311404a94f64e145db99f76782e171965ba
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/98714
Tested-by: Jenkins CollaboraOffice 
Reviewed-by: Michael Meeks 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 4aca03e38..66620a1d0 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -389,7 +389,7 @@ public:
 {
 _inFragmentBlock = true;
 // If is not final fragment then wait for next fragment.
-return false;
+return true;
 }
 #else
 handleMessage(_wsPayload);
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2020-03-12 Thread Tor Lillqvist (via logerrit)
 net/WebSocketHandler.hpp |   13 +
 1 file changed, 9 insertions(+), 4 deletions(-)

New commits:
commit 5b9bbea3aaeeb756305d1ec1764a975bf235351b
Author: Tor Lillqvist 
AuthorDate: Thu Mar 12 19:01:39 2020 +0200
Commit: Tor Lillqvist 
CommitDate: Thu Mar 12 19:15:56 2020 +0100

Fix assertion failure in the MOBILEAPP case

Change-Id: I5c3647d1cc6975bd56b9c5276f6eba7585ac785c
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/90432
Tested-by: Tor Lillqvist 
Reviewed-by: Tor Lillqvist 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 1c2977602..3a01fea17 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -616,16 +616,21 @@ private:
 out.insert(out.end(), data, data + len);
 }
 const size_t size = out.size() - oldSize;
+
+if (flush)
+socket->writeOutgoingData();
 #else
 LOG_TRC("WebSocketHandle::sendFrame: Writing to #" << socket->getFD() 
<< " " << len << " bytes");
-assert(flush);
-assert(out.size() == 0);
 
+// We ignore the flush parameter and always flush in the MOBILEAPP 
case because there is no
+// WebSocket framing, we put the messages as such into the FakeSocket 
queue.
+
+(void) flush;
 out.insert(out.end(), data, data + len);
 const size_t size = out.size();
+
+socket->writeOutgoingData();
 #endif
-if (flush)
-socket->writeOutgoingData();
 
 return size;
 }
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2020-01-06 Thread Michael Meeks (via logerrit)
 net/WebSocketHandler.hpp |3 +++
 1 file changed, 3 insertions(+)

New commits:
commit 7788bd9268ba0e148ed7572586ff6068cb3f68d1
Author: Michael Meeks 
AuthorDate: Mon Jan 6 15:10:02 2020 +
Commit: Michael Meeks 
CommitDate: Mon Jan 6 15:34:24 2020 +

Avoid taking address over the end of a vector if reading 0 bytes.

Happens with some close frames eg.

[ docbroker_001 ] TRC  #21: Incoming WebSocket data of 6 bytes: 88 80 4a 2c 
44 f9  | ..J,D.|

fin = true
OpCode is Close (= 0x8)
hasMask = true
payloadLen = 0
headerLen = 2 -> 6 after hasMask is taken into account.

Change-Id: I0e212e4589c3cc63db16f7065dc90cd0bd539ada

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 1d24fa26a..17d364d3a 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -607,6 +607,9 @@ protected:
 
 void readPayload(unsigned char *data, size_t dataLen, unsigned char* mask, 
std::vector& payload)
 {
+if (dataLen == 0)
+return;
+
 if (mask)
 {
 size_t end = payload.size();
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2019-11-22 Thread Corentin Noël (via logerrit)
 net/WebSocketHandler.hpp |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit db67c9239b0f4866ea37453c015f9684c4267f0f
Author: Corentin Noël 
AuthorDate: Fri Nov 22 15:09:16 2019 +0100
Commit: Michael Meeks 
CommitDate: Fri Nov 22 16:23:35 2019 +0100

WebSocketHandler: allow to build on 32bits systems

Change-Id: Id51df359d9c985e72e9186433ce5dcf98e4199a4
Reviewed-on: https://gerrit.libreoffice.org/83492
Reviewed-by: Michael Meeks 
Tested-by: Michael Meeks 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index f37d459a2..1d24fa26a 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -524,7 +524,7 @@ private:
 /// Returns the number of bytes written (including frame overhead) on 
success,
 /// 0 for closed/invalid socket, and -1 for other errors.
 int sendFrame(const std::shared_ptr& socket,
-  const char* data, const size_t len,
+  const char* data, const uint64_t len,
   unsigned char flags, const bool flush = true) const
 {
 if (!socket || data == nullptr || len == 0)
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2019-08-16 Thread Ashod Nakashian (via logerrit)
 net/WebSocketHandler.hpp |   14 +-
 1 file changed, 9 insertions(+), 5 deletions(-)

New commits:
commit fca12fc1ab45c4c215ffd05814a34bb8b9855c8e
Author: Ashod Nakashian 
AuthorDate: Sun Mar 31 23:30:05 2019 -0400
Commit: Ashod Nakashian 
CommitDate: Sat Aug 17 04:27:26 2019 +0200

wsd: formatting

Change-Id: I07b91c494fe89395ebe1e91506baef46dc03aca8
Reviewed-on: https://gerrit.libreoffice.org/70035
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 
Reviewed-on: https://gerrit.libreoffice.org/71092

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 30381a7ed..f37d459a2 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -227,7 +227,8 @@ public:
 
 if (payloadLen + headerLen > len)
 { // partial read wait for more data.
-LOG_TRC("#" << socket->getFD() << ": Still incomplete WebSocket 
frame, have " << len << " bytes, frame is " << payloadLen + headerLen << " 
bytes");
+LOG_TRC("#" << socket->getFD() << ": Still incomplete WebSocket 
frame, have " << len
+<< " bytes, frame is " << payloadLen + headerLen << " 
bytes");
 return false;
 }
 
@@ -238,7 +239,8 @@ public:
 return true;
 }
 
-LOG_TRC("#" << socket->getFD() << ": Incoming WebSocket data of " << 
len << " bytes: " << Util::stringifyHexLine(socket->getInBuffer(), 0, 
std::min((size_t)32, len)));
+LOG_TRC("#" << socket->getFD() << ": Incoming WebSocket data of " << 
len << " bytes: "
+<< Util::stringifyHexLine(socket->getInBuffer(), 0, 
std::min((size_t)32, len)));
 
 data = p + headerLen;
 
@@ -693,7 +695,8 @@ protected:
 {
 std::shared_ptr socket = _socket.lock();
 
-LOG_TRC("Incoming client websocket upgrade response: " << 
std::string(&socket->getInBuffer()[0], socket->getInBuffer().size()));
+LOG_TRC("Incoming client websocket upgrade response: "
+<< std::string(&socket->getInBuffer()[0], 
socket->getInBuffer().size()));
 
 bool bOk = false;
 StreamSocket::MessageMap map;
@@ -715,8 +718,9 @@ protected:
 map._headerSize = itBody - socket->getInBuffer().begin() + 
marker.size();
 }
 
-if (response.getStatus() == 
Poco::Net::HTTPResponse::HTTP_SWITCHING_PROTOCOLS &&
-response.has("Upgrade") && 
Poco::icompare(response.get("Upgrade"), "websocket") == 0)
+if (response.getStatus() == 
Poco::Net::HTTPResponse::HTTP_SWITCHING_PROTOCOLS
+&& response.has("Upgrade")
+&& Poco::icompare(response.get("Upgrade"), "websocket") == 0)
 {
 #if 0 // SAL_DEBUG ...
 const std::string wsKey = response.get("Sec-WebSocket-Accept", 
"");
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2019-05-29 Thread Libreoffice Gerrit user
 net/WebSocketHandler.hpp |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

New commits:
commit fc6a316dd4cdf539e7f015978a6313a5ff1ea462
Author: Michael Meeks 
AuthorDate: Wed May 29 13:10:44 2019 +0100
Commit: Michael Meeks 
CommitDate: Wed May 29 15:40:46 2019 +0100

Improve debugging by showing un-masked websocket content.

Change-Id: I0df0b3cc7b13c36ed8afaaec4ed2fe525458a21c

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 3f3f2aac0..30381a7ed 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -360,7 +360,8 @@ public:
 
 LOG_TRC("#" << socket->getFD() << ": Incoming WebSocket frame code " 
<< static_cast(code) <<
 ", fin? " << fin << ", mask? " << hasMask << ", payload 
length: " << payloadLen <<
-", residual socket data: " << socket->getInBuffer().size() << 
" bytes.");
+", residual socket data: " << socket->getInBuffer().size() << 
" bytes, unmasked data: "+
+Util::stringifyHexLine(_wsPayload, 0, std::min((size_t)32, 
_wsPayload.size(;
 
 if (fin)
 {
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2019-05-27 Thread Libreoffice Gerrit user
 net/WebSocketHandler.hpp |9 ++---
 1 file changed, 6 insertions(+), 3 deletions(-)

New commits:
commit 4e1ed7205d22f630b112f8edce8ba09d873fcd40
Author: Miklos Vajna 
AuthorDate: Mon May 27 09:06:38 2019 +0200
Commit: Miklos Vajna 
CommitDate: Mon May 27 09:06:38 2019 +0200

net: avoid UB in WebSocketHandler::readPayload()

Seen when closing a Writer document.


/home/vmiklos/lode/opt_private/gcc-7.3.0/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/bits/stl_vector.h:798:9:
 runtime error: reference binding to null pointer of type 'char'
#0 0x6ff633 in std::vector 
>::operator[](unsigned long) 
/home/vmiklos/lode/opt_private/gcc-7.3.0/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/bits/stl_vector.h:798:2
#1 0x770d0c in WebSocketHandler::readPayload(unsigned char*, unsigned 
long, unsigned char*, std::vector >&) 
/home/vmiklos/lode/dev/online/./net/WebSocketHandler.hpp:611:29
#2 0x759324 in 
WebSocketHandler::handleTCPStream(std::shared_ptr const&) 
/home/vmiklos/lode/dev/online/./net/WebSocketHandler.hpp:251:13
#3 0x6f820d in 
WebSocketHandler::handleIncomingMessage(SocketDisposition&) 
/home/vmiklos/lode/dev/online/./net/WebSocketHandler.hpp:419:20
#4 0xb2da64 in ClientSession::handleIncomingMessage(SocketDisposition&) 
/home/vmiklos/lode/dev/online/wsd/ClientSession.cpp:74:14
#5 0xa70a61 in StreamSocket::handlePoll(SocketDisposition&, 
std::chrono::time_point > >, int) 
/home/vmiklos/lode/dev/online/./net/Socket.hpp:1037:29
#6 0x6ec83d in SocketPoll::poll(int) 
/home/vmiklos/lode/dev/online/./net/Socket.hpp:570:34
#7 0x830019 in DocumentBroker::pollThread() 
/home/vmiklos/lode/dev/online/wsd/DocumentBroker.cpp:286:16
#8 0x8fdb38 in DocumentBroker::DocumentBrokerPoll::pollingThread() 
/home/vmiklos/lode/dev/online/wsd/DocumentBroker.cpp:165:20
#9 0xe00e75 in SocketPoll::pollingThreadEntry() 
/home/vmiklos/lode/dev/online/net/Socket.cpp:184:9
#10 0xe49cfd in void std::__invoke_impl(std::__invoke_memfun_deref, void (SocketPoll::*&&)(), 
SocketPoll*&&) 
/home/vmiklos/lode/opt_private/gcc-7.3.0/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/bits/invoke.h:73:14
#11 0xe4980a in std::__invoke_result::type std::__invoke(void 
(SocketPoll::*&&)(), SocketPoll*&&) 
/home/vmiklos/lode/opt_private/gcc-7.3.0/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/bits/invoke.h:95:14
#12 0xe496bd in decltype(std::__invoke(_S_declval<0ul>(), 
_S_declval<1ul>())) std::thread::_Invoker >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) 
/home/vmiklos/lode/opt_private/gcc-7.3.0/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/thread:234:13
#13 0xe494c7 in std::thread::_Invoker >::operator()() 
/home/vmiklos/lode/opt_private/gcc-7.3.0/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/thread:243:11
#14 0xe4888a in 
std::thread::_State_impl > >::_M_run() 
/home/vmiklos/lode/opt_private/gcc-7.3.0/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/thread:186:13
#15 0x7f2c5805fe2e in execute_native_thread_routine 
/home/vmiklos/lode/packages/gccbuild/x86_64-pc-linux-gnu/libstdc++-v3/src/c++11/../../../../../gcc-7.3.0/libstdc++-v3/src/c++11/thread.cc:83
#16 0x7f2c57a3c558 in start_thread (/lib64/libpthread.so.0+0x7558)
#17 0x7f2c5715082e in clone (/lib64/libc.so.6+0xf882e)

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior 
/home/vmiklos/lode/opt_private/gcc-7.3.0/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/bits/stl_vector.h:798:9
 in

Change-Id: Ifaf6b193e9bba480587c2e184df55aa0728bb370

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index f5f767e4f..3f3f2aac0 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -608,9 +608,12 @@ protected:
 {
 size_t end = payload.size();
 payload.resize(end + dataLen);
-char* wsData = &payload[end];
-for (size_t i = 0; i < dataLen; ++i)
-*wsData++ = data[i] ^ mask[i % 4];
+if (dataLen > 0)
+{
+char* wsData = &payload[end];
+for (size_t i = 0; i < dataLen; ++i)
+*wsData++ = data[i] ^ mask[i % 4];
+}
 }
 else
 payload.insert(payload.end(), data, data + dataLen);
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2019-03-12 Thread Libreoffice Gerrit user
 net/WebSocketHandler.hpp |  266 +++
 1 file changed, 181 insertions(+), 85 deletions(-)

New commits:
commit 023cbfc32da4b32a0db44ed0497c0ddeab121ff5
Author: Gabriel Masei 
AuthorDate: Fri Mar 8 10:21:17 2019 +0200
Commit: Michael Meeks 
CommitDate: Tue Mar 12 15:19:42 2019 +0100

Added support for defragmentation of incoming websocket fragmented messages 
and handled some protocol error cases

Change-Id: I4d11a6527b6b131c65101fd53b71015529645f74
Reviewed-on: https://gerrit.libreoffice.org/68901
Reviewed-by: Michael Meeks 
Tested-by: Michael Meeks 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 88350df1e..1b24ab93b 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -37,6 +37,8 @@ private:
 std::atomic _shuttingDown;
 bool _isClient;
 bool _isMasking;
+bool _inFragmentBlock;
+bool _isManualDefrag;
 
 protected:
 struct WSFrameMask
@@ -50,16 +52,29 @@ protected:
 
 public:
 /// Perform upgrade ourselves, or select a client web socket.
-WebSocketHandler(bool isClient = false, bool isMasking = true) :
+/// Parameters:
+/// isClient: the instance should behave like a client (true) or like a 
server (false)
+///   (from websocket perspective)
+/// isMasking: a client should mask (true) or not (false) outgoing frames
+/// isManualDefrag: the message handler should be called for every 
fragment of a message and
+/// defragmentation should be handled inside message 
handler (true) or the message handler
+/// should be called after all fragments of a message were 
received and the message
+/// was defragmented (false).
+WebSocketHandler(bool isClient = false, bool isMasking = true, bool 
isManualDefrag = false) :
 _lastPingSentTime(std::chrono::steady_clock::now()),
 _pingTimeUs(0),
 _shuttingDown(false),
 _isClient(isClient),
-_isMasking(isClient && isMasking)
+_isMasking(isClient && isMasking),
+_inFragmentBlock(false),
+_isManualDefrag(isManualDefrag)
 {
 }
 
 /// Upgrades itself to a websocket directly.
+/// Parameters:
+/// socket: the TCP socket which received the upgrade request
+/// request: the HTTP upgrade request to WebSocket
 WebSocketHandler(const std::weak_ptr& socket,
  const Poco::Net::HTTPRequest& request) :
 _socket(socket),
@@ -69,7 +84,9 @@ public:
 _pingTimeUs(0),
 _shuttingDown(false),
 _isClient(false),
-_isMasking(false)
+_isMasking(false),
+_inFragmentBlock(false),
+_isManualDefrag(false)
 {
 upgradeToWebSocket(request);
 }
@@ -99,8 +116,8 @@ public:
 RESERVED_TLS_FAILURE= 1015
 };
 
-/// Sends WS shutdown message to the peer.
-void shutdown(const StatusCodes statusCode = StatusCodes::NORMAL_CLOSE, 
const std::string& statusMessage = "")
+/// Sends WS Close frame to the peer.
+void sendCloseFrame(const StatusCodes statusCode = 
StatusCodes::NORMAL_CLOSE, const std::string& statusMessage = "")
 {
 std::shared_ptr socket = _socket.lock();
 if (socket == nullptr)
@@ -126,7 +143,22 @@ public:
 #endif
 }
 
-bool handleOneIncomingMessage(const std::shared_ptr& socket)
+void shutdown(const StatusCodes statusCode = StatusCodes::NORMAL_CLOSE, 
const std::string& statusMessage = "")
+{
+if (!_shuttingDown)
+sendCloseFrame(statusCode, statusMessage);
+std::shared_ptr socket = _socket.lock();
+if (socket)
+{
+socket->closeConnection();
+socket->getInBuffer().clear();
+}
+_wsPayload.clear();
+_inFragmentBlock = false;
+_shuttingDown = false;
+}
+
+bool handleTCPStream(const std::shared_ptr& socket)
 {
 assert(socket && "Expected a valid socket instance.");
 
@@ -177,7 +209,7 @@ public:
 headerLen += 8;
 }
 
-unsigned char *data, *mask;
+unsigned char *data, *mask = nullptr;
 
 if (hasMask)
 {
@@ -187,117 +219,165 @@ public:
 
 if (payloadLen + headerLen > len)
 { // partial read wait for more data.
-LOG_TRC("#" << socket->getFD() << ": Still incomplete WebSocket 
message, have " << len << " bytes, message is " << payloadLen + headerLen << " 
bytes");
+LOG_TRC("#" << socket->getFD() << ": Still incomplete WebSocket 
frame, have " << len << " bytes, frame is " << payloadLen + headerLen << " 
bytes");
 return false;
 }
 
+if (hasMask && _isClient)
+{
+LOG_ERR("#" << socket->getFD() << ": Servers should not send 
masked frames. Only clients.");
+shutdown(StatusCodes::PROTOCOL_ERROR);
+return true;
+}
+
 LOG_TRC("#" <

[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2018-09-19 Thread Libreoffice Gerrit user
 net/WebSocketHandler.hpp |6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

New commits:
commit a4f19ac22988712859008e83ce3df161a48d89c2
Author: Tor Lillqvist 
AuthorDate: Wed Sep 19 10:30:19 2018 +0300
Commit: Tor Lillqvist 
CommitDate: Wed Sep 19 10:33:41 2018 +0300

Avoid double "0x" prefix for pointer values in log output

No need for explicit "0x" and std::hex when outputting a pointer. A
pointer will be output as a hex number anyway. We used to have things
like this in the log:

TRC  #25 Connected to WS Handler 0x0x3610b60| ./net/WebSocketHandler.hpp:80

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 0bb0ddc1f..104c9b879 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -77,7 +77,7 @@ public:
 void onConnect(const std::shared_ptr& socket) override
 {
 _socket = socket;
-LOG_TRC("#" << socket->getFD() << " Connected to WS Handler 0x" << 
std::hex << this << std::dec);
+LOG_TRC("#" << socket->getFD() << " Connected to WS Handler " << this);
 }
 
 /// Status codes sent to peer on shutdown.
@@ -104,7 +104,7 @@ public:
 std::shared_ptr socket = _socket.lock();
 if (socket == nullptr)
 {
-LOG_ERR("No socket associated with WebSocketHandler 0x" << 
std::hex << this << std::dec);
+LOG_ERR("No socket associated with WebSocketHandler " << this);
 return;
 }
 
@@ -309,7 +309,7 @@ public:
 std::shared_ptr socket = _socket.lock();
 if (socket == nullptr)
 {
-LOG_ERR("No socket associated with WebSocketHandler 0x" << 
std::hex << this << std::dec);
+LOG_ERR("No socket associated with WebSocketHandler " << this);
 }
 else if (_isClient && !socket->isWebSocket())
 handleClientUpgrade();
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2018-07-19 Thread Tor Lillqvist
 net/WebSocketHandler.hpp |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit ff31f2dba19766b77a668a450d73745152544b96
Author: Tor Lillqvist 
Date:   Thu Jul 19 11:39:32 2018 +0300

Avoid potential confusion by not using the term "packet" in a comment

It confused at least me for a while into pondering whether the code
thinks TCP is packet-oriented.

Change-Id: I143fc7821abd6b4023d551cdcb42a00e1613e466

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index d6933d173..6ef1460e0 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -299,7 +299,7 @@ public:
 else
 {
 while (handleOneIncomingMessage(socket))
-; // can have multiple msgs in one recv'd packet.
+; // might have multiple messages in the accumulated buffer.
 }
 }
 
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2018-07-19 Thread Tor Lillqvist
 net/WebSocketHandler.hpp |   16 
 1 file changed, 12 insertions(+), 4 deletions(-)

New commits:
commit 6b96c73f46d1c27f0054aea840a05bcc58fa1930
Author: Tor Lillqvist 
Date:   Thu Jul 19 11:35:48 2018 +0300

Don't log binary data as such, use Util::stringifyHexLine()

Also, log the cases with still incomplete data in the buffer
separately.

Change-Id: Idfa915378c2823dd898789d6a63a0cd71a817b8a

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index e1e04dac1..d6933d173 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -133,11 +133,11 @@ public:
 if (len == 0)
 return false; // avoid logging.
 
-// FIXME: Do we really want to dump binary data as such here?
-LOG_TRC("#" << socket->getFD() << ": Incoming WebSocket data of " << 
len << " bytes: " << std::string(socket->_inBuffer.data(), 
socket->_inBuffer.size()));
-
 if (len < 2) // partial read
+{
+LOG_TRC("#" << socket->getFD() << ": Still incomplete WebSocket 
message, have " << len << " bytes");
 return false;
+}
 
 unsigned char *p = reinterpret_cast(&socket->_inBuffer[0]);
 const bool fin = p[0] & 0x80;
@@ -150,7 +150,10 @@ public:
 if (payloadLen == 126) // 2 byte length
 {
 if (len < 2 + 2)
+{
+LOG_TRC("#" << socket->getFD() << ": Still incomplete 
WebSocket message, have " << len << " bytes");
 return false;
+}
 
 payloadLen = (((unsigned)p[2]) << 8) | ((unsigned)p[3]);
 headerLen += 2;
@@ -158,8 +161,10 @@ public:
 else if (payloadLen == 127) // 8 byte length
 {
 if (len < 2 + 8)
+{
+LOG_TRC("#" << socket->getFD() << ": Still incomplete 
WebSocket message, have " << len << " bytes");
 return false;
-
+}
 payloadLen = uint64_t)p[9]) <<  0) + (((uint64_t)p[8]) <<  8) +
   (((uint64_t)p[7]) << 16) + (((uint64_t)p[6]) << 24) +
   (((uint64_t)p[5]) << 32) + (((uint64_t)p[4]) << 40) +
@@ -178,9 +183,12 @@ public:
 
 if (payloadLen + headerLen > len)
 { // partial read wait for more data.
+LOG_TRC("#" << socket->getFD() << ": Still incomplete WebSocket 
message, have " << len << " bytes, message is " << payloadLen + headerLen << " 
bytes");
 return false;
 }
 
+LOG_TRC("#" << socket->getFD() << ": Incoming WebSocket data of " << 
len << " bytes: " << Util::stringifyHexLine(socket->_inBuffer, 0, 
std::min((size_t)32, len)));
+
 data = p + headerLen;
 
 if (hasMask)
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2018-07-18 Thread Tor Lillqvist
 net/WebSocketHandler.hpp |1 +
 1 file changed, 1 insertion(+)

New commits:
commit 1e7a56ddc6452e5a47743644e24026b856f9c6ef
Author: Tor Lillqvist 
Date:   Wed Jul 18 21:16:49 2018 +0300

Add FIXME: Do we really want to log binary data as such here?

Change-Id: I386d3c377d698f25da5094d87cd82183fc36aee4

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 5b9aa5460..e1e04dac1 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -133,6 +133,7 @@ public:
 if (len == 0)
 return false; // avoid logging.
 
+// FIXME: Do we really want to dump binary data as such here?
 LOG_TRC("#" << socket->getFD() << ": Incoming WebSocket data of " << 
len << " bytes: " << std::string(socket->_inBuffer.data(), 
socket->_inBuffer.size()));
 
 if (len < 2) // partial read
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2017-12-11 Thread Jan Holesovsky
 net/WebSocketHandler.hpp |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit 73d7aee2acbf63789169e10a4f3405afa71ece7a
Author: Jan Holesovsky 
Date:   Mon Dec 11 15:27:29 2017 +0100

Fix an assert.

Change-Id: I5825a19740c0fa46c6cd14f067d0c1d3927c0c0b
Reviewed-on: https://gerrit.libreoffice.org/46236
Reviewed-by: Jan Holesovsky 
Tested-by: Jan Holesovsky 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index cae461bc..1b37389d 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -316,7 +316,7 @@ public:
 int sendMessage(const char* data, const size_t len, const WSOpCode code, 
const bool flush = true) const
 {
 int unitReturn = -1;
-if (UnitWSD::get().filterSendMessage(data, len, code, flush, 
unitReturn))
+if (UnitBase::get().filterSendMessage(data, len, code, flush, 
unitReturn))
 return unitReturn;
 
 //TODO: Support fragmented messages.
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2017-10-26 Thread Tor Lillqvist
 net/WebSocketHandler.hpp |5 +
 1 file changed, 5 insertions(+)

New commits:
commit 6b0faf9d97d9c479f3297ccfc0bf1b06d1de0e34
Author: Tor Lillqvist 
Date:   Thu Oct 26 11:38:43 2017 +0300

Avoid warning "this statement may fall through" when intentional

Change-Id: I8d8bcb4747a1933e4ecefe1220a80a355e60317f

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 7c52cf58..383f1139 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -217,6 +217,11 @@ public:
 case WSOpCode::Ping:
 LOG_ERR("#" << socket->getFD() << ": Clients should not send 
pings, only servers");
 // drop through
+#if defined __clang__
+[[clang::fallthrough]];
+#elif defined __GNUC__ && __GNUC__ >= 7
+[[fallthrough]];
+#endif
 case WSOpCode::Close:
 if (!_shuttingDown)
 {
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp wsd/LOOLWSD.cpp

2017-04-16 Thread Ashod Nakashian
 net/WebSocketHandler.hpp |2 +-
 wsd/LOOLWSD.cpp  |1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

New commits:
commit 1262378301011fe799d06869b62814d89992a538
Author: Ashod Nakashian 
Date:   Sun Apr 16 19:45:54 2017 -0400

wsd: send document unloading error as WS message

Without an explicit WS message, the client
does not get this message and the handler
is not invoked at all.

Change-Id: I71e210a9958965cff35dd4d0f1d99985429b82f4
Reviewed-on: https://gerrit.libreoffice.org/36593
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 85cad811..c6d69883 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -269,7 +269,7 @@ public:
 int getPollEvents(std::chrono::steady_clock::time_point now,
   int & timeoutMaxMs) override
 {
-int timeSincePingMs =
+const int timeSincePingMs =
 std::chrono::duration_cast(now - 
_pingSent).count();
 timeoutMaxMs = std::min(timeoutMaxMs, PingFrequencyMs - 
timeSincePingMs);
 return POLLIN;
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 5112e9ae..e3619b6e 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -1241,6 +1241,7 @@ static std::shared_ptr 
findOrCreateDocBroker(WebSocketHandler& w
 if (docBroker->isMarkedToDestroy())
 {
 LOG_WRN("DocBroker with docKey [" << docKey << "] that is marked 
to be destroyed. Rejecting client request.");
+ws.sendMessage("error: cmd=load kind=docunloading");
 ws.shutdown(WebSocketHandler::StatusCodes::ENDPOINT_GOING_AWAY, 
"error: cmd=load kind=docunloading");
 return nullptr;
 }
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2017-04-09 Thread Ashod Nakashian
 net/WebSocketHandler.hpp |   10 +++---
 1 file changed, 7 insertions(+), 3 deletions(-)

New commits:
commit 0dab4b597da5dd6531eaa8634dbafe69a8b41a40
Author: Ashod Nakashian 
Date:   Sun Apr 9 18:24:51 2017 -0400

wsd: return the actual number of bytes written to WS

Change-Id: Ib28c432927733ffd437d27dec749d402d25b9024
Reviewed-on: https://gerrit.libreoffice.org/36323
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 7c004c7c..85cad811 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -195,11 +195,14 @@ public:
 } else
 _wsPayload.insert(_wsPayload.end(), data, data + payloadLen);
 
+assert(_wsPayload.size() >= payloadLen);
+
 socket->_inBuffer.erase(socket->_inBuffer.begin(), 
socket->_inBuffer.begin() + headerLen + payloadLen);
 
 // FIXME: fin, aggregating payloads into _wsPayload etc.
 LOG_TRC("#" << socket->getFD() << ": Incoming WebSocket message code " 
<< code <<
-" fin? " << fin << ", mask? " << hasMask << " payload length: 
" << _wsPayload.size());
+", fin? " << fin << ", mask? " << hasMask << ", payload 
length: " << _wsPayload.size() <<
+", residual socket data: " << socket->_inBuffer.size() << " 
bytes.");
 
 switch (code)
 {
@@ -340,6 +343,7 @@ protected:
 
 socket->assertCorrectThread();
 std::vector& out = socket->_outBuffer;
+const size_t oldSize = out.size();
 
 out.push_back(flags);
 
@@ -368,12 +372,12 @@ protected:
 
 // Copy the data.
 out.insert(out.end(), data, data + len);
+const size_t size = out.size() - oldSize;
 
 if (flush)
 socket->writeOutgoingData();
 
-// Data + header.
-return len + 2;
+return size;
 }
 
 /// To be overriden to handle the websocket messages the way you need.
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2017-04-09 Thread Ashod Nakashian
 net/WebSocketHandler.hpp |   37 ++---
 1 file changed, 26 insertions(+), 11 deletions(-)

New commits:
commit e00817acf67111e6ffac2527c5faa4ed03190b56
Author: Ashod Nakashian 
Date:   Sun Apr 9 18:20:52 2017 -0400

wsd: fix pinging and add logs

Apparently pinging was enabled only when
_not_ WebSocket upgraded, which is wrong.

Removed sending ping immediately after
upgrading to WS as it's superfluous.

Change-Id: Ic8103bab063d87f58d371f0eab49f7b7530e2374
Reviewed-on: https://gerrit.libreoffice.org/36322
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 66adbc0a..7c004c7c 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -273,16 +273,20 @@ public:
 }
 
 /// Send a ping message
-void sendPing(std::chrono::steady_clock::time_point now)
+void sendPing(std::chrono::steady_clock::time_point now,
+  const std::shared_ptr& socket)
 {
+assert(socket && "Expected a valid socket instance.");
+
 // Must not send this before we're upgraded.
-if (_wsState == WSState::WS)
+if (_wsState != WSState::WS)
 {
 LOG_WRN("Attempted ping on non-upgraded websocket!");
 _pingSent = now; // Pretend we sent it to avoid timing out 
immediately.
 return;
 }
-LOG_TRC("Send ping message");
+
+LOG_TRC("#" << socket->getFD() << ": Sending ping.");
 // FIXME: allow an empty payload.
 sendMessage("", 1, WSOpCode::Ping, false);
 _pingSent = now;
@@ -291,10 +295,14 @@ public:
 /// Do we need to handle a timeout ?
 void checkTimeout(std::chrono::steady_clock::time_point now) override
 {
-int timeSincePingMs =
+const int timeSincePingMs =
 std::chrono::duration_cast(now - 
_pingSent).count();
 if (timeSincePingMs >= PingFrequencyMs)
-sendPing(now);
+{
+const std::shared_ptr socket = _socket.lock();
+if (socket)
+sendPing(now, socket);
+}
 }
 
 /// By default rely on the socket buffer.
@@ -402,7 +410,12 @@ protected:
 const std::string wsKey = req.get("Sec-WebSocket-Key", "");
 const std::string wsProtocol = req.get("Sec-WebSocket-Protocol", 
"chat");
 // FIXME: other sanity checks ...
-LOG_INF("#" << socket->getFD() << ": WebSocket version " << wsVersion 
<< " key '" << wsKey << "'.");
+LOG_INF("#" << socket->getFD() << ": WebSocket version: " << wsVersion 
<<
+", key: [" << wsKey << "], protocol: [" << wsProtocol << "].");
+
+// Want very low latency sockets.
+socket->setNoDelay();
+socket->setSocketBufferSize(0);
 
 std::ostringstream oss;
 oss << "HTTP/1.1 101 Switching Protocols\r\n"
@@ -411,13 +424,15 @@ protected:
 << "Sec-WebSocket-Accept: " << 
PublicComputeAccept::doComputeAccept(wsKey) << "\r\n"
 << "\r\n";
 
-// Want very low latency sockets.
-socket->setNoDelay();
-socket->setSocketBufferSize(0);
+const std::string res = oss.str();
+LOG_TRC("#" << socket->getFD() << ": Sending WS Upgrade response: " << 
res);
+socket->send(res);
 
-socket->send(oss.str());
 _wsState = WSState::WS;
-sendPing(std::chrono::steady_clock::now());
+
+// No need to ping right upon connection/upgrade,
+// but do reset the time to avoid pinging immediately after.
+_pingSent = std::chrono::steady_clock::now();
 }
 };
 
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2017-04-02 Thread Ashod Nakashian
 net/WebSocketHandler.hpp |   31 +--
 1 file changed, 17 insertions(+), 14 deletions(-)

New commits:
commit b52a8ac6e2806e3ebdc73726040eb70a908a40cc
Author: Ashod Nakashian 
Date:   Sun Apr 2 23:27:06 2017 -0400

wsd: const correctness and avoid unnecessary shared_ptr promotion

Change-Id: I4352d82e7b5c6873837e73ec04d894dce9a716b7
Reviewed-on: https://gerrit.libreoffice.org/36036
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index a7cae8f4..1c6caf46 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -126,15 +126,9 @@ public:
 sendFrame(socket, buf.data(), buf.size(), flags);
 }
 
-/// Implementation of the SocketHandlerInterface.
-virtual bool handleOneIncomingMessage()
+bool handleOneIncomingMessage(const std::shared_ptr& socket)
 {
-auto socket = _socket.lock();
-if (socket == nullptr)
-{
-LOG_ERR("No socket associated with WebSocketHandler 0x" << 
std::hex << this << std::dec);
-return false;
-}
+assert(socket && "Expected a valid socket instance.");
 
 // websocket fun !
 const size_t len = socket->_inBuffer.size();
@@ -148,9 +142,9 @@ public:
 return false;
 
 unsigned char *p = reinterpret_cast(&socket->_inBuffer[0]);
-bool fin = p[0] & 0x80;
-WSOpCode code = static_cast(p[0] & 0x0f);
-bool hasMask = p[1] & 0x80;
+const bool fin = p[0] & 0x80;
+const WSOpCode code = static_cast(p[0] & 0x0f);
+const bool hasMask = p[1] & 0x80;
 size_t payloadLen = p[1] & 0x7f;
 size_t headerLen = 2;
 
@@ -204,7 +198,8 @@ public:
 socket->_inBuffer.erase(socket->_inBuffer.begin(), 
socket->_inBuffer.begin() + headerLen + payloadLen);
 
 // FIXME: fin, aggregating payloads into _wsPayload etc.
-LOG_TRC("#" << socket->getFD() << ": Incoming WebSocket message code " 
<< code << " fin? " << fin << ", payload length: " << _wsPayload.size());
+LOG_TRC("#" << socket->getFD() << ": Incoming WebSocket message code " 
<< code <<
+" fin? " << fin << ", mask? " << hasMask << " payload length: 
" << _wsPayload.size());
 
 switch (code)
 {
@@ -254,8 +249,16 @@ public:
 /// Implementation of the SocketHandlerInterface.
 virtual SocketHandlerInterface::SocketOwnership handleIncomingMessage() 
override
 {
-while (handleOneIncomingMessage())
-; // can have multiple msgs in one recv'd packet.
+auto socket = _socket.lock();
+if (socket == nullptr)
+{
+LOG_ERR("No socket associated with WebSocketHandler 0x" << 
std::hex << this << std::dec);
+}
+else
+{
+while (handleOneIncomingMessage(socket))
+; // can have multiple msgs in one recv'd packet.
+}
 
 return SocketHandlerInterface::SocketOwnership::UNCHANGED;
 }
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2017-03-25 Thread Ashod Nakashian
 net/WebSocketHandler.hpp |6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

New commits:
commit c1ffb649048f6735a5804a8febc8689b52b28596
Author: Ashod Nakashian 
Date:   Sat Mar 25 21:51:25 2017 -0400

wsd: correct shutdown status code echoed back

Change-Id: Ieb685135ab280ed76070af3392bfa69cf313f35a
Reviewed-on: https://gerrit.libreoffice.org/35708
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 08500bf2..6983fbae 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -213,8 +213,10 @@ public:
 if (!_shuttingDown)
 {
 // Peer-initiated shutdown must be echoed.
-// Otherwise, this is the echo to _out_ shutdown message.
-const StatusCodes statusCode = 
static_cast((static_cast(_wsPayload[0]) << 8) | 
_wsPayload[1]);
+// Otherwise, this is the echo to _our_ shutdown message, 
which we should ignore.
+const StatusCodes statusCode = 
static_castuint64_t)(unsigned char)_wsPayload[0]) << 8) +
+
(((uint64_t)(unsigned char)_wsPayload[1]) << 0));
+LOG_TRC("#" << socket->getFD() << ": Client initiated socket 
shutdown. Code: " << static_cast(statusCode));
 if (_wsPayload.size() > 2)
 {
 const std::string message(&_wsPayload[2], &_wsPayload[2] + 
_wsPayload.size() - 2);
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2017-03-10 Thread Michael Meeks
 net/WebSocketHandler.hpp |6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

New commits:
commit 7a90430f85eb60a96def51fde15b324bc3a66431
Author: Michael Meeks 
Date:   Fri Mar 10 14:49:19 2017 +

Cleanup logging on single packet websocket messages more cleanly.

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index b445ac7..5e987fb 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -118,6 +118,10 @@ public:
 
 // websocket fun !
 const size_t len = socket->_inBuffer.size();
+
+if (len == 0)
+return false; // avoid logging.
+
 LOG_TRC("Incoming WebSocket data of " << len << " bytes to socket #" 
<< socket->getFD());
 
 if (len < 2) // partial read
@@ -216,7 +220,7 @@ public:
 /// Implementation of the SocketHandlerInterface.
 virtual void handleIncomingMessage() override
 {
-while (handleOneIncomingMessage() && _inBuffer.size() > 0)
+while (handleOneIncomingMessage())
 ; // can have multiple msgs in one recv'd packet.
 }
 
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2017-03-10 Thread Michael Meeks
 net/WebSocketHandler.hpp |   22 --
 1 file changed, 16 insertions(+), 6 deletions(-)

New commits:
commit 11f3a29cb2b5f5985d398ae4d7b3244d2467489f
Author: Michael Meeks 
Date:   Fri Mar 10 14:36:21 2017 +

WebSocket - several messages can appear in a single packet.

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 333b1be..b445ac7 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -110,18 +110,18 @@ public:
 }
 
 /// Implementation of the SocketHandlerInterface.
-virtual void handleIncomingMessage() override
+virtual bool handleOneIncomingMessage()
 {
 auto socket = _socket.lock();
 if (socket == nullptr)
-return;
+return false;
 
 // websocket fun !
 const size_t len = socket->_inBuffer.size();
 LOG_TRC("Incoming WebSocket data of " << len << " bytes to socket #" 
<< socket->getFD());
 
 if (len < 2) // partial read
-return;
+return false;
 
 unsigned char *p = reinterpret_cast(&socket->_inBuffer[0]);
 bool fin = p[0] & 0x80;
@@ -134,7 +134,7 @@ public:
 if (payloadLen == 126) // 2 byte length
 {
 if (len < 2 + 2)
-return;
+return false;
 
 payloadLen = (((unsigned)p[2]) << 8) | ((unsigned)p[3]);
 headerLen += 2;
@@ -142,7 +142,7 @@ public:
 else if (payloadLen == 127) // 8 byte length
 {
 if (len < 2 + 8)
-return;
+return false;
 
 payloadLen = uint64_t)p[9]) <<  0) + (((uint64_t)p[8]) <<  8) +
   (((uint64_t)p[7]) << 16) + (((uint64_t)p[6]) << 24) +
@@ -162,7 +162,7 @@ public:
 
 if (payloadLen + headerLen > len)
 { // partial read wait for more data.
-return;
+return false;
 }
 
 data = p + headerLen;
@@ -209,8 +209,18 @@ public:
 }
 
 _wsPayload.clear();
+
+return true;
 }
 
+/// Implementation of the SocketHandlerInterface.
+virtual void handleIncomingMessage() override
+{
+while (handleOneIncomingMessage() && _inBuffer.size() > 0)
+; // can have multiple msgs in one recv'd packet.
+}
+
+
 bool hasQueuedWrites() const override
 {
 LOG_TRC("WebSocket - asked for queued writes");
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: net/WebSocketHandler.hpp

2017-03-10 Thread Miklos Vajna
 net/WebSocketHandler.hpp |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

New commits:
commit 400c580800799894f9ee195eba50f9c37be8377c
Author: Miklos Vajna 
Date:   Fri Mar 10 11:06:43 2017 +0100

net: fix -Werror,-Wconstant-conversion

Change-Id: If2bbad6d3909c7d6df9eed5edf260609d64db3a8

diff --git a/net/WebSocketHandler.hpp b/net/WebSocketHandler.hpp
index 5331005..27536a5 100644
--- a/net/WebSocketHandler.hpp
+++ b/net/WebSocketHandler.hpp
@@ -250,7 +250,7 @@ public:
 {
 const std::string nextmessage = "nextmessage: size=" + 
std::to_string(len);
 const unsigned char size = (nextmessage.size() & 0xff);
-out.push_back(fin | WSOpCode::Text);
+out.push_back(static_cast(fin | WSOpCode::Text));
 out.push_back(size);
 out.insert(out.end(), nextmessage.data(), nextmessage.data() + 
size);
 socket->writeOutgoingData();
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits