diff --git a/Builds/VisualStudio2013/RippleD.vcxproj b/Builds/VisualStudio2013/RippleD.vcxproj index 528f490ec5..b3883c29e0 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj +++ b/Builds/VisualStudio2013/RippleD.vcxproj @@ -1959,20 +1959,6 @@ True True - - - - True - True - - - - - True - True - - - @@ -3476,8 +3462,6 @@ - - @@ -3509,14 +3493,20 @@ True - - True - - + - + + + + + True + + True + + + True diff --git a/Builds/VisualStudio2013/RippleD.vcxproj.filters b/Builds/VisualStudio2013/RippleD.vcxproj.filters index cf763724f1..b1a26deac6 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj.filters +++ b/Builds/VisualStudio2013/RippleD.vcxproj.filters @@ -463,9 +463,6 @@ {44780F86-42D3-2F2B-0846-5AEE2CA6D7FE} - - {400881DE-C875-8CE8-E61F-A7992E624248} - {15B4B65A-0F03-7BA9-38CD-42A5712392CB} @@ -2640,21 +2637,6 @@ ripple\app\websocket - - ripple\app\websocket - - - ripple\app\websocket - - - ripple\app\websocket - - - ripple\app\websocket - - - ripple\app\websocket - ripple\basics @@ -4194,9 +4176,6 @@ ripple\unity - - ripple\unity - ripple\validators @@ -4236,15 +4215,24 @@ ripple\validators\tests - - ripple\websocket\autosocket - - - ripple\websocket\autosocket + + ripple\websocket - - ripple\websocket\autosocket + + ripple\websocket + + + ripple\websocket + + + ripple\websocket + + ripple\websocket + + + ripple\websocket + rocksdb2\db diff --git a/src/ripple/app/main/Application.cpp b/src/ripple/app/main/Application.cpp index c560b75f5a..f5e1947ebb 100644 --- a/src/ripple/app/main/Application.cpp +++ b/src/ripple/app/main/Application.cpp @@ -40,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -62,6 +61,7 @@ #include #include #include +#include #include #include #include diff --git a/src/ripple/app/websocket/WSConnection.cpp b/src/ripple/app/websocket/WSConnection.cpp deleted file mode 100644 index b4846e371b..0000000000 --- a/src/ripple/app/websocket/WSConnection.cpp +++ /dev/null @@ -1,219 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ripple { - -WSConnection::WSConnection (HTTP::Port const& port, - Resource::Manager& resourceManager, Resource::Consumer usage, - InfoSub::Source& source, bool isPublic, - beast::IP::Endpoint const& remoteAddress, - boost::asio::io_service& io_service) - : InfoSub (source, usage) - , port_(port) - , m_resourceManager (resourceManager) - , m_isPublic (isPublic) - , m_remoteAddress (remoteAddress) - , m_netOPs (getApp ().getOPs ()) - , m_pingTimer (io_service) - , m_sentPing (false) - , m_receiveQueueRunning (false) - , m_isDead (false) - , m_io_service (io_service) -{ - WriteLog (lsDEBUG, WSConnection) << - "Websocket connection from " << remoteAddress; -} - -WSConnection::~WSConnection () -{ -} - -void WSConnection::onPong (std::string const&) -{ - m_sentPing = false; -} - -void WSConnection::rcvMessage ( - message_ptr msg, bool& msgRejected, bool& runQueue) -{ - ScopedLockType sl (m_receiveQueueMutex); - - if (m_isDead) - { - msgRejected = false; - runQueue = false; - return; - } - - if ((m_receiveQueue.size () >= 1000) || - (msg->get_payload().size() > 1000000)) - { - msgRejected = true; - runQueue = false; - } - else - { - msgRejected = false; - m_receiveQueue.push_back (msg); - - if (m_receiveQueueRunning) - runQueue = false; - else - { - runQueue = true; - m_receiveQueueRunning = true; - } - } -} - -bool WSConnection::checkMessage () -{ - ScopedLockType sl (m_receiveQueueMutex); - - assert (m_receiveQueueRunning); - - if (m_isDead || m_receiveQueue.empty ()) - { - m_receiveQueueRunning = false; - return false; - } - - return true; -} - -WSConnection::message_ptr WSConnection::getMessage () -{ - ScopedLockType sl (m_receiveQueueMutex); - - if (m_isDead || m_receiveQueue.empty ()) - { - m_receiveQueueRunning = false; - return message_ptr (); - } - - message_ptr m = m_receiveQueue.front (); - m_receiveQueue.pop_front (); - return m; -} - -void WSConnection::returnMessage (message_ptr ptr) -{ - ScopedLockType sl (m_receiveQueueMutex); - - if (!m_isDead) - { - m_receiveQueue.push_front (ptr); - m_receiveQueueRunning = false; - } -} - -Json::Value WSConnection::invokeCommand (Json::Value& jvRequest) -{ - if (getConsumer().disconnect ()) - { - disconnect (); - return rpcError (rpcSLOW_DOWN); - } - - // Requests without "command" are invalid. - // - if (!jvRequest.isMember (jss::command)) - { - Json::Value jvResult (Json::objectValue); - - jvResult[jss::type] = "response"; - jvResult[jss::status] = jss::error; - jvResult[jss::error] = jss::missingCommand; - jvResult[jss::request] = jvRequest; - - if (jvRequest.isMember (jss::id)) - { - jvResult[jss::id] = jvRequest[jss::id]; - } - - getConsumer().charge (Resource::feeInvalidRPC); - - return jvResult; - } - - Resource::Charge loadType = Resource::feeReferenceRPC; - Json::Value jvResult (Json::objectValue); - - Role const required = RPC::roleRequired ( - jvRequest[jss::command].asString()); - - Role const role = requestRole (required, port_, jvRequest, m_remoteAddress, - getConfig().RPC_ADMIN_ALLOW); - - if (Role::FORBID == role) - { - jvResult[jss::result] = rpcError (rpcFORBIDDEN); - } - else - { - RPC::Context context { - jvRequest, loadType, m_netOPs, role, - std::dynamic_pointer_cast (this->shared_from_this ())}; - RPC::doCommand (context, jvResult[jss::result]); - recordMetrics (context); - } - - getConsumer().charge (loadType); - if (getConsumer().warn ()) - { - jvResult[jss::warning] = jss::load; - } - - // Currently we will simply unwrap errors returned by the RPC - // API, in the future maybe we can make the responses - // consistent. - // - // Regularize result. This is duplicate code. - if (jvResult[jss::result].isMember (jss::error)) - { - jvResult = jvResult[jss::result]; - jvResult[jss::status] = jss::error; - jvResult[jss::request] = jvRequest; - - } - else - { - jvResult[jss::status] = jss::success; - } - - if (jvRequest.isMember (jss::id)) - { - jvResult[jss::id] = jvRequest[jss::id]; - } - - jvResult[jss::type] = "response"; - - return jvResult; -} - -} // ripple diff --git a/src/ripple/app/websocket/WSServerHandler.cpp b/src/ripple/app/websocket/WSServerHandler.cpp deleted file mode 100644 index e517246033..0000000000 --- a/src/ripple/app/websocket/WSServerHandler.cpp +++ /dev/null @@ -1,25 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#include -#include - -namespace ripple { - -} // ripple diff --git a/src/ripple/net/impl/HTTPClient.cpp b/src/ripple/net/impl/HTTPClient.cpp index a47d7cc837..af17f2c4f5 100644 --- a/src/ripple/net/impl/HTTPClient.cpp +++ b/src/ripple/net/impl/HTTPClient.cpp @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/ripple/protocol/JsonFields.h b/src/ripple/protocol/JsonFields.h index 09b11a0aa5..fed1d0fa79 100644 --- a/src/ripple/protocol/JsonFields.h +++ b/src/ripple/protocol/JsonFields.h @@ -287,6 +287,7 @@ JSS ( reserve_base ); // out: NetworkOPs JSS ( reserve_base_xrp ); // out: NetworkOPs JSS ( reserve_inc ); // out: NetworkOPs JSS ( reserve_inc_xrp ); // out: NetworkOPs +JSS ( response ); // websocket JSS ( result ); // RPC JSS ( ripple_lines ); // out: NetworkOPs JSS ( ripple_state ); // in: LedgerEntr diff --git a/src/ripple/unity/app.cpp b/src/ripple/unity/app.cpp index cf7541431c..d92b405094 100644 --- a/src/ripple/unity/app.cpp +++ b/src/ripple/unity/app.cpp @@ -18,16 +18,12 @@ //============================================================================== #include -#include -#include #include -#include -#include -#include -#include -#include -#include #include +#include #include +#include +#include #include +#include #include diff --git a/src/ripple/unity/websocket.cpp b/src/ripple/unity/websocket.cpp index 87ce979a91..2e81da378f 100644 --- a/src/ripple/unity/websocket.cpp +++ b/src/ripple/unity/websocket.cpp @@ -24,23 +24,24 @@ #endif #include -#include +#include -// Unity build file for websocket -// - -#include - -// Must come first to prevent compile errors +// Must come first to prevent compilation errors. #include +#include +#include #include #include #include #include -#include #include +#include #include -#include -#include +#include + +#include + +// Must come last to prevent compilation errors. +#include diff --git a/src/ripple/websocket/autosocket/AutoSocket.h b/src/ripple/websocket/AutoSocket.h similarity index 100% rename from src/ripple/websocket/autosocket/AutoSocket.h rename to src/ripple/websocket/AutoSocket.h diff --git a/src/ripple/app/websocket/WSConnection.h b/src/ripple/websocket/Connection.h similarity index 58% rename from src/ripple/app/websocket/WSConnection.h rename to src/ripple/websocket/Connection.h index b27398e276..e517713635 100644 --- a/src/ripple/app/websocket/WSConnection.h +++ b/src/ripple/websocket/Connection.h @@ -20,14 +20,24 @@ #ifndef RIPPLE_APP_WEBSOCKET_WSCONNECTION_H_INCLUDED #define RIPPLE_APP_WEBSOCKET_WSCONNECTION_H_INCLUDED +#include #include +#include +#include #include +#include #include +#include +#include +#include +#include #include +#include #include #include -#include #include +#include +#include #include #include @@ -60,7 +70,7 @@ protected: virtual void preDestroy () = 0; virtual void disconnect () = 0; - + virtual void recordMetrics (RPC::Context const&) const = 0; public: @@ -226,6 +236,204 @@ public: } }; +//------------------------------------------------------------------------------ +// This next code will become templated in the next change so these methods are +// brought here to simplify diffs. + +inline +WSConnection::WSConnection (HTTP::Port const& port, + Resource::Manager& resourceManager, Resource::Consumer usage, + InfoSub::Source& source, bool isPublic, + beast::IP::Endpoint const& remoteAddress, + boost::asio::io_service& io_service) + : InfoSub (source, usage) + , port_(port) + , m_resourceManager (resourceManager) + , m_isPublic (isPublic) + , m_remoteAddress (remoteAddress) + , m_netOPs (getApp ().getOPs ()) + , m_pingTimer (io_service) + , m_sentPing (false) + , m_receiveQueueRunning (false) + , m_isDead (false) + , m_io_service (io_service) +{ + WriteLog (lsDEBUG, WSConnection) << + "Websocket connection from " << remoteAddress; +} + +inline +WSConnection::~WSConnection () +{ +} + +inline +void WSConnection::onPong (std::string const&) +{ + m_sentPing = false; +} + +inline +void WSConnection::rcvMessage ( + message_ptr msg, bool& msgRejected, bool& runQueue) +{ + ScopedLockType sl (m_receiveQueueMutex); + + if (m_isDead) + { + msgRejected = false; + runQueue = false; + return; + } + + if ((m_receiveQueue.size () >= 1000) || + (msg->get_payload().size() > 1000000)) + { + msgRejected = true; + runQueue = false; + } + else + { + msgRejected = false; + m_receiveQueue.push_back (msg); + + if (m_receiveQueueRunning) + runQueue = false; + else + { + runQueue = true; + m_receiveQueueRunning = true; + } + } +} + +inline +bool WSConnection::checkMessage () +{ + ScopedLockType sl (m_receiveQueueMutex); + + assert (m_receiveQueueRunning); + + if (m_isDead || m_receiveQueue.empty ()) + { + m_receiveQueueRunning = false; + return false; + } + + return true; +} + +inline +WSConnection::message_ptr WSConnection::getMessage () +{ + ScopedLockType sl (m_receiveQueueMutex); + + if (m_isDead || m_receiveQueue.empty ()) + { + m_receiveQueueRunning = false; + return message_ptr (); + } + + message_ptr m = m_receiveQueue.front (); + m_receiveQueue.pop_front (); + return m; +} + +inline +void WSConnection::returnMessage (message_ptr ptr) +{ + ScopedLockType sl (m_receiveQueueMutex); + + if (!m_isDead) + { + m_receiveQueue.push_front (ptr); + m_receiveQueueRunning = false; + } +} + +inline +Json::Value WSConnection::invokeCommand (Json::Value& jvRequest) +{ + if (getConsumer().disconnect ()) + { + disconnect (); + return rpcError (rpcSLOW_DOWN); + } + + // Requests without "command" are invalid. + // + if (!jvRequest.isMember (jss::command)) + { + Json::Value jvResult (Json::objectValue); + + jvResult[jss::type] = jss::response; + jvResult[jss::status] = jss::error; + jvResult[jss::error] = jss::missingCommand; + jvResult[jss::request] = jvRequest; + + if (jvRequest.isMember (jss::id)) + { + jvResult[jss::id] = jvRequest[jss::id]; + } + + getConsumer().charge (Resource::feeInvalidRPC); + + return jvResult; + } + + Resource::Charge loadType = Resource::feeReferenceRPC; + Json::Value jvResult (Json::objectValue); + + auto required = RPC::roleRequired (jvRequest[jss::command].asString()); + Role const role = requestRole (required, port_, jvRequest, m_remoteAddress, + getConfig().RPC_ADMIN_ALLOW); + + if (Role::FORBID == role) + { + jvResult[jss::result] = rpcError (rpcFORBIDDEN); + } + else + { + RPC::Context context { + jvRequest, loadType, m_netOPs, role, + std::dynamic_pointer_cast (this->shared_from_this ())}; + RPC::doCommand (context, jvResult[jss::result]); + } + + getConsumer().charge (loadType); + if (getConsumer().warn ()) + { + jvResult[jss::warning] = jss::load; + } + + // Currently we will simply unwrap errors returned by the RPC + // API, in the future maybe we can make the responses + // consistent. + // + // Regularize result. This is duplicate code. + if (jvResult[jss::result].isMember (jss::error)) + { + jvResult = jvResult[jss::result]; + jvResult[jss::status] = jss::error; + jvResult[jss::request] = jvRequest; + + } + else + { + jvResult[jss::status] = jss::success; + } + + if (jvRequest.isMember (jss::id)) + { + jvResult[jss::id] = jvRequest[jss::id]; + } + + jvResult[jss::type] = jss::response; + + return jvResult; +} + + } // ripple #endif diff --git a/src/ripple/app/websocket/WSServerHandler.h b/src/ripple/websocket/Handler.h similarity index 99% rename from src/ripple/app/websocket/WSServerHandler.h rename to src/ripple/websocket/Handler.h index 3a5aa046fe..e848a38a56 100644 --- a/src/ripple/app/websocket/WSServerHandler.h +++ b/src/ripple/websocket/Handler.h @@ -22,11 +22,10 @@ #include #include -#include #include #include #include -#include +#include #include #include @@ -436,7 +435,7 @@ public: if (jCmd.isString()) job.rename (std::string ("WSClient::") + jCmd.asString()); } - + auto const start (std::chrono::high_resolution_clock::now ()); Json::Value const jvObj (conn->invokeCommand (jvRequest)); std::string const buffer (to_string (jvObj)); diff --git a/src/ripple/websocket/autosocket/LogWebsockets.cpp b/src/ripple/websocket/LogWebsockets.cpp similarity index 100% rename from src/ripple/websocket/autosocket/LogWebsockets.cpp rename to src/ripple/websocket/LogWebsockets.cpp diff --git a/src/ripple/app/websocket/WSDoor.cpp b/src/ripple/websocket/MakeServer.cpp similarity index 97% rename from src/ripple/app/websocket/WSDoor.cpp rename to src/ripple/websocket/MakeServer.cpp index 6599b326e0..2b3eb58bb9 100644 --- a/src/ripple/app/websocket/WSDoor.cpp +++ b/src/ripple/websocket/MakeServer.cpp @@ -18,9 +18,8 @@ //============================================================================== #include -#include -#include -#include +#include +#include #include #include // #include diff --git a/src/ripple/app/websocket/WSDoor.h b/src/ripple/websocket/MakeServer.h similarity index 100% rename from src/ripple/app/websocket/WSDoor.h rename to src/ripple/websocket/MakeServer.h diff --git a/src/ripple/websocket/autosocket/AutoSocket.cpp b/src/ripple/websocket/autosocket/AutoSocket.cpp deleted file mode 100644 index 060c847276..0000000000 --- a/src/ripple/websocket/autosocket/AutoSocket.cpp +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#include - -// VFALCO - Empty file? diff --git a/src/websocketpp_02/src/sockets/autotls.hpp b/src/websocketpp_02/src/sockets/autotls.hpp index da6a9f373d..f0ae9fbb74 100644 --- a/src/websocketpp_02/src/sockets/autotls.hpp +++ b/src/websocketpp_02/src/sockets/autotls.hpp @@ -28,7 +28,7 @@ #ifndef WEBSOCKETPP_SOCKET_AUTOTLS_HPP #define WEBSOCKETPP_SOCKET_AUTOTLS_HPP -#include +#include #include #include