mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
Don't pass websocket messages to coroutine
This commit is contained in:
@@ -94,7 +94,7 @@ public:
|
||||
|
||||
void onPong (std::string const&);
|
||||
void rcvMessage (message_ptr const&, bool& msgRejected, bool& runQueue);
|
||||
message_ptr getMessage ();
|
||||
boost::optional <std::string> 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 <message_ptr> m_receiveQueue;
|
||||
std::deque <std::string> m_receiveQueue;
|
||||
NetworkOPs& m_netOPs;
|
||||
boost::asio::io_service& m_io_service;
|
||||
boost::asio::deadline_timer m_pingTimer;
|
||||
@@ -188,7 +188,8 @@ void ConnectionImpl <WebSocket>::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 <WebSocket>::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 <WebSocket>::checkMessage ()
|
||||
}
|
||||
|
||||
template <class WebSocket>
|
||||
typename WebSocket::MessagePtr ConnectionImpl <WebSocket>::getMessage ()
|
||||
boost::optional <std::string>
|
||||
ConnectionImpl <WebSocket>::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 <std::string> ret (std::move (m_receiveQueue.front ()));
|
||||
m_receiveQueue.pop_front ();
|
||||
return m;
|
||||
return ret;
|
||||
}
|
||||
|
||||
template <class WebSocket>
|
||||
|
||||
@@ -365,11 +365,11 @@ public:
|
||||
//
|
||||
for (int i = 0; i < 3; ++i)
|
||||
{
|
||||
message_ptr msg = ptr->getMessage ();
|
||||
boost::optional <std::string> 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<JobCoro> 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user