diff --git a/src/ripple/websocket/Connection.h b/src/ripple/websocket/Connection.h index 9f72803f2..f20561910 100644 --- a/src/ripple/websocket/Connection.h +++ b/src/ripple/websocket/Connection.h @@ -94,7 +94,7 @@ public: void onPong (std::string const&); void rcvMessage (message_ptr const&, bool& msgRejected, bool& runQueue); - message_ptr getMessage (); + boost::optional getMessage (); bool checkMessage (); void returnMessage (message_ptr const&); Json::Value invokeCommand (Json::Value const& jvRequest, @@ -112,7 +112,7 @@ private: std::string const m_forwardedFor; std::string const m_user; std::mutex m_receiveQueueMutex; - std::deque m_receiveQueue; + std::deque m_receiveQueue; NetworkOPs& m_netOPs; boost::asio::io_service& m_io_service; boost::asio::deadline_timer m_pingTimer; @@ -188,7 +188,8 @@ void ConnectionImpl ::rcvMessage ( } if ((m_receiveQueue.size () >= 1000) || - (msg->get_payload().size() > 1000000)) + (msg->get_payload().size() > 1000000) || + ! WebSocket::isTextMessage (*msg)) { msgRejected = true; runQueue = false; @@ -196,7 +197,7 @@ void ConnectionImpl ::rcvMessage ( else { msgRejected = false; - m_receiveQueue.push_back (msg); + m_receiveQueue.push_back (msg->get_payload ()); if (m_receiveQueueRunning) runQueue = false; @@ -225,19 +226,20 @@ bool ConnectionImpl ::checkMessage () } template -typename WebSocket::MessagePtr ConnectionImpl ::getMessage () +boost::optional +ConnectionImpl ::getMessage () { ScopedLockType sl (m_receiveQueueMutex); if (m_isDead || m_receiveQueue.empty ()) { m_receiveQueueRunning = false; - return message_ptr (); + return boost::none; } - message_ptr m = m_receiveQueue.front (); + boost::optional ret (std::move (m_receiveQueue.front ())); m_receiveQueue.pop_front (); - return m; + return ret; } template diff --git a/src/ripple/websocket/Handler.h b/src/ripple/websocket/Handler.h index 834fb76ed..c5c4e4ecf 100644 --- a/src/ripple/websocket/Handler.h +++ b/src/ripple/websocket/Handler.h @@ -365,11 +365,11 @@ public: // for (int i = 0; i < 3; ++i) { - message_ptr msg = ptr->getMessage (); + boost::optional msg = ptr->getMessage (); if (! msg) return; - do_message(jc, cpClient, ptr, msg); + do_message(jc, cpClient, ptr, *msg); } if (ptr->checkMessage ()) @@ -379,7 +379,7 @@ public: void do_message (std::shared_ptr const& jc, const connection_ptr cpClient, wsc_ptr conn, - const message_ptr& mpMessage) + const std::string& message) { Json::Value jvRequest; Json::Reader jrReader; @@ -389,30 +389,20 @@ public: JLOG (j_.debug) << "Ws:: Receiving(" << cpClient->get_socket ().remote_endpoint () - << ") '" << mpMessage->get_payload () << "'"; + << ") '" << message << "'"; } catch (std::exception const&) { } - if (!WebSocket::isTextMessage (*mpMessage)) - { - Json::Value jvResult (Json::objectValue); - - jvResult[jss::type] = jss::error; - jvResult[jss::error] = "wsTextRequired"; - // We only accept text messages. - - send (cpClient, jvResult, false); - } - else if (!jrReader.parse (mpMessage->get_payload (), jvRequest) || + if (!jrReader.parse (message, jvRequest) || ! jvRequest || !jvRequest.isObject ()) { Json::Value jvResult (Json::objectValue); jvResult[jss::type] = jss::error; jvResult[jss::error] = "jsonInvalid"; // Received invalid json. - jvResult[jss::value] = mpMessage->get_payload (); + jvResult[jss::value] = message; send (cpClient, jvResult, false); }