[Libreoffice-commits] online.git: net/WebSocketHandler.hpp
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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