mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-22 03:55:53 +00:00
Rename all WebSocket code into one directory.
This commit is contained in:
@@ -1959,20 +1959,6 @@
|
|||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\app\websocket\WSConnection.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\app\websocket\WSDoor.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\app\websocket\WSDoor.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\app\websocket\WSServerHandler.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\app\websocket\WSServerHandler.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\basics\base_uint.h">
|
<ClInclude Include="..\..\src\ripple\basics\base_uint.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple\basics\BasicConfig.h">
|
<ClInclude Include="..\..\src\ripple\basics\BasicConfig.h">
|
||||||
@@ -3476,8 +3462,6 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\unity\websocket.cpp">
|
<ClCompile Include="..\..\src\ripple\unity\websocket.cpp">
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\unity\websocket.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\validators\Connection.h">
|
<ClInclude Include="..\..\src\ripple\validators\Connection.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\validators\impl\ConnectionImp.cpp">
|
<ClCompile Include="..\..\src\ripple\validators\impl\ConnectionImp.cpp">
|
||||||
@@ -3509,14 +3493,20 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\validators\tests\Validators.test.cpp">
|
<ClCompile Include="..\..\src\ripple\validators\tests\Validators.test.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\websocket\autosocket\AutoSocket.cpp">
|
<ClInclude Include="..\..\src\ripple\websocket\AutoSocket.h">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\websocket\autosocket\AutoSocket.h">
|
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\websocket\autosocket\LogWebsockets.cpp">
|
<ClInclude Include="..\..\src\ripple\websocket\Connection.h">
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\ripple\websocket\Handler.h">
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\ripple\websocket\LogWebsockets.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\ripple\websocket\MakeServer.cpp">
|
||||||
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\ripple\websocket\MakeServer.h">
|
||||||
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\rocksdb2\db\builder.cc">
|
<ClCompile Include="..\..\src\rocksdb2\db\builder.cc">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|||||||
@@ -463,9 +463,6 @@
|
|||||||
<Filter Include="ripple\websocket">
|
<Filter Include="ripple\websocket">
|
||||||
<UniqueIdentifier>{44780F86-42D3-2F2B-0846-5AEE2CA6D7FE}</UniqueIdentifier>
|
<UniqueIdentifier>{44780F86-42D3-2F2B-0846-5AEE2CA6D7FE}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="ripple\websocket\autosocket">
|
|
||||||
<UniqueIdentifier>{400881DE-C875-8CE8-E61F-A7992E624248}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="rocksdb2">
|
<Filter Include="rocksdb2">
|
||||||
<UniqueIdentifier>{15B4B65A-0F03-7BA9-38CD-42A5712392CB}</UniqueIdentifier>
|
<UniqueIdentifier>{15B4B65A-0F03-7BA9-38CD-42A5712392CB}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@@ -2640,21 +2637,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\app\websocket\WSConnection.cpp">
|
<ClCompile Include="..\..\src\ripple\app\websocket\WSConnection.cpp">
|
||||||
<Filter>ripple\app\websocket</Filter>
|
<Filter>ripple\app\websocket</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\app\websocket\WSConnection.h">
|
|
||||||
<Filter>ripple\app\websocket</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\app\websocket\WSDoor.cpp">
|
|
||||||
<Filter>ripple\app\websocket</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\app\websocket\WSDoor.h">
|
|
||||||
<Filter>ripple\app\websocket</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\app\websocket\WSServerHandler.cpp">
|
|
||||||
<Filter>ripple\app\websocket</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\app\websocket\WSServerHandler.h">
|
|
||||||
<Filter>ripple\app\websocket</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\basics\base_uint.h">
|
<ClInclude Include="..\..\src\ripple\basics\base_uint.h">
|
||||||
<Filter>ripple\basics</Filter>
|
<Filter>ripple\basics</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -4194,9 +4176,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\unity\websocket.cpp">
|
<ClCompile Include="..\..\src\ripple\unity\websocket.cpp">
|
||||||
<Filter>ripple\unity</Filter>
|
<Filter>ripple\unity</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\unity\websocket.h">
|
|
||||||
<Filter>ripple\unity</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\validators\Connection.h">
|
<ClInclude Include="..\..\src\ripple\validators\Connection.h">
|
||||||
<Filter>ripple\validators</Filter>
|
<Filter>ripple\validators</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -4236,15 +4215,24 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\validators\tests\Validators.test.cpp">
|
<ClCompile Include="..\..\src\ripple\validators\tests\Validators.test.cpp">
|
||||||
<Filter>ripple\validators\tests</Filter>
|
<Filter>ripple\validators\tests</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\websocket\autosocket\AutoSocket.cpp">
|
<ClInclude Include="..\..\src\ripple\websocket\AutoSocket.h">
|
||||||
<Filter>ripple\websocket\autosocket</Filter>
|
<Filter>ripple\websocket</Filter>
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\websocket\autosocket\AutoSocket.h">
|
|
||||||
<Filter>ripple\websocket\autosocket</Filter>
|
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\websocket\autosocket\LogWebsockets.cpp">
|
<ClInclude Include="..\..\src\ripple\websocket\Connection.h">
|
||||||
<Filter>ripple\websocket\autosocket</Filter>
|
<Filter>ripple\websocket</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\ripple\websocket\Handler.h">
|
||||||
|
<Filter>ripple\websocket</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClCompile Include="..\..\src\ripple\websocket\LogWebsockets.cpp">
|
||||||
|
<Filter>ripple\websocket</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\ripple\websocket\MakeServer.cpp">
|
||||||
|
<Filter>ripple\websocket</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClInclude Include="..\..\src\ripple\websocket\MakeServer.h">
|
||||||
|
<Filter>ripple\websocket</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\rocksdb2\db\builder.cc">
|
<ClCompile Include="..\..\src\rocksdb2\db\builder.cc">
|
||||||
<Filter>rocksdb2\db</Filter>
|
<Filter>rocksdb2\db</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
#include <ripple/app/paths/PathRequests.h>
|
#include <ripple/app/paths/PathRequests.h>
|
||||||
#include <ripple/app/peers/UniqueNodeList.h>
|
#include <ripple/app/peers/UniqueNodeList.h>
|
||||||
#include <ripple/app/tx/TransactionMaster.h>
|
#include <ripple/app/tx/TransactionMaster.h>
|
||||||
#include <ripple/app/websocket/WSDoor.h>
|
|
||||||
#include <ripple/basics/Log.h>
|
#include <ripple/basics/Log.h>
|
||||||
#include <ripple/basics/LoggedTimings.h>
|
#include <ripple/basics/LoggedTimings.h>
|
||||||
#include <ripple/basics/ResolverAsio.h>
|
#include <ripple/basics/ResolverAsio.h>
|
||||||
@@ -62,6 +61,7 @@
|
|||||||
#include <ripple/shamap/Family.h>
|
#include <ripple/shamap/Family.h>
|
||||||
#include <ripple/validators/make_Manager.h>
|
#include <ripple/validators/make_Manager.h>
|
||||||
#include <ripple/unity/git_id.h>
|
#include <ripple/unity/git_id.h>
|
||||||
|
#include <ripple/websocket/MakeServer.h>
|
||||||
#include <beast/asio/io_latency_probe.h>
|
#include <beast/asio/io_latency_probe.h>
|
||||||
#include <beast/module/core/text/LexicalCast.h>
|
#include <beast/module/core/text/LexicalCast.h>
|
||||||
#include <beast/module/core/thread/DeadlineTimer.h>
|
#include <beast/module/core/thread/DeadlineTimer.h>
|
||||||
|
|||||||
@@ -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 <BeastConfig.h>
|
|
||||||
#include <ripple/app/websocket/WSConnection.h>
|
|
||||||
#include <ripple/net/RPCErr.h>
|
|
||||||
#include <ripple/app/main/Application.h>
|
|
||||||
#include <ripple/protocol/JsonFields.h>
|
|
||||||
#include <ripple/resource/Fees.h>
|
|
||||||
#include <ripple/server/Role.h>
|
|
||||||
#include <ripple/rpc/RPCHandler.h>
|
|
||||||
|
|
||||||
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<InfoSub> (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
|
|
||||||
@@ -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 <BeastConfig.h>
|
|
||||||
#include <ripple/app/websocket/WSServerHandler.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
|
|
||||||
} // ripple
|
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
#include <ripple/basics/StringUtilities.h>
|
#include <ripple/basics/StringUtilities.h>
|
||||||
#include <ripple/core/Config.h>
|
#include <ripple/core/Config.h>
|
||||||
#include <ripple/net/HTTPClient.h>
|
#include <ripple/net/HTTPClient.h>
|
||||||
#include <ripple/websocket/autosocket/AutoSocket.h>
|
#include <ripple/websocket/AutoSocket.h>
|
||||||
#include <beast/asio/placeholders.h>
|
#include <beast/asio/placeholders.h>
|
||||||
#include <beast/module/core/text/LexicalCast.h>
|
#include <beast/module/core/text/LexicalCast.h>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
|
|||||||
@@ -287,6 +287,7 @@ JSS ( reserve_base ); // out: NetworkOPs
|
|||||||
JSS ( reserve_base_xrp ); // out: NetworkOPs
|
JSS ( reserve_base_xrp ); // out: NetworkOPs
|
||||||
JSS ( reserve_inc ); // out: NetworkOPs
|
JSS ( reserve_inc ); // out: NetworkOPs
|
||||||
JSS ( reserve_inc_xrp ); // out: NetworkOPs
|
JSS ( reserve_inc_xrp ); // out: NetworkOPs
|
||||||
|
JSS ( response ); // websocket
|
||||||
JSS ( result ); // RPC
|
JSS ( result ); // RPC
|
||||||
JSS ( ripple_lines ); // out: NetworkOPs
|
JSS ( ripple_lines ); // out: NetworkOPs
|
||||||
JSS ( ripple_state ); // in: LedgerEntr
|
JSS ( ripple_state ); // in: LedgerEntr
|
||||||
|
|||||||
@@ -18,16 +18,12 @@
|
|||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
#include <BeastConfig.h>
|
#include <BeastConfig.h>
|
||||||
#include <ripple/rpc/Manager.h>
|
|
||||||
#include <ripple/unity/websocket.h>
|
|
||||||
#include <ripple/app/impl/BasicApp.cpp>
|
#include <ripple/app/impl/BasicApp.cpp>
|
||||||
#include <ripple/app/main/CollectorManager.cpp>
|
|
||||||
#include <ripple/app/main/NodeStoreScheduler.cpp>
|
|
||||||
#include <ripple/app/websocket/WSServerHandler.cpp>
|
|
||||||
#include <ripple/app/websocket/WSConnection.cpp>
|
|
||||||
#include <ripple/app/websocket/WSDoor.cpp>
|
|
||||||
#include <ripple/app/node/SqliteFactory.cpp>
|
|
||||||
#include <ripple/app/main/Application.cpp>
|
#include <ripple/app/main/Application.cpp>
|
||||||
|
#include <ripple/app/main/CollectorManager.cpp>
|
||||||
#include <ripple/app/main/Main.cpp>
|
#include <ripple/app/main/Main.cpp>
|
||||||
|
#include <ripple/app/main/NodeStoreScheduler.cpp>
|
||||||
|
#include <ripple/app/node/SqliteFactory.cpp>
|
||||||
#include <ripple/resource/Manager.h>
|
#include <ripple/resource/Manager.h>
|
||||||
|
#include <ripple/rpc/Manager.h>
|
||||||
#include <beast/module/core/time/Time.h>
|
#include <beast/module/core/time/Time.h>
|
||||||
|
|||||||
@@ -24,23 +24,24 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <ripple/unity/websocket.h>
|
#include <beast/module/core/text/LexicalCast.h>
|
||||||
|
|
||||||
// Unity build file for websocket
|
// Must come first to prevent compilation errors.
|
||||||
//
|
|
||||||
|
|
||||||
#include <websocketpp_02/src/sha1/sha1.h>
|
|
||||||
|
|
||||||
// Must come first to prevent compile errors
|
|
||||||
#include <websocketpp_02/src/uri.cpp>
|
#include <websocketpp_02/src/uri.cpp>
|
||||||
|
|
||||||
|
#include <websocketpp_02/src/sockets/socket_base.hpp>
|
||||||
|
#include <websocketpp_02/src/websocketpp.hpp>
|
||||||
#include <websocketpp_02/src/base64/base64.cpp>
|
#include <websocketpp_02/src/base64/base64.cpp>
|
||||||
#include <websocketpp_02/src/messages/data.cpp>
|
#include <websocketpp_02/src/messages/data.cpp>
|
||||||
#include <websocketpp_02/src/processors/hybi_header.cpp>
|
#include <websocketpp_02/src/processors/hybi_header.cpp>
|
||||||
#include <websocketpp_02/src/processors/hybi_util.cpp>
|
#include <websocketpp_02/src/processors/hybi_util.cpp>
|
||||||
#include <websocketpp_02/src/md5/md5.c>
|
|
||||||
#include <websocketpp_02/src/network_utilities.cpp>
|
#include <websocketpp_02/src/network_utilities.cpp>
|
||||||
|
#include <websocketpp_02/src/sha1/sha1.h>
|
||||||
#include <websocketpp_02/src/sha1/sha1.cpp>
|
#include <websocketpp_02/src/sha1/sha1.cpp>
|
||||||
|
|
||||||
#include <ripple/websocket/autosocket/AutoSocket.cpp>
|
#include <ripple/websocket/MakeServer.cpp>
|
||||||
#include <ripple/websocket/autosocket/LogWebsockets.cpp>
|
|
||||||
|
#include <ripple/websocket/LogWebsockets.cpp>
|
||||||
|
|
||||||
|
// Must come last to prevent compilation errors.
|
||||||
|
#include <websocketpp_02/src/md5/md5.c>
|
||||||
|
|||||||
@@ -20,14 +20,24 @@
|
|||||||
#ifndef RIPPLE_APP_WEBSOCKET_WSCONNECTION_H_INCLUDED
|
#ifndef RIPPLE_APP_WEBSOCKET_WSCONNECTION_H_INCLUDED
|
||||||
#define RIPPLE_APP_WEBSOCKET_WSCONNECTION_H_INCLUDED
|
#define RIPPLE_APP_WEBSOCKET_WSCONNECTION_H_INCLUDED
|
||||||
|
|
||||||
|
#include <ripple/app/main/Application.h>
|
||||||
#include <ripple/app/misc/NetworkOPs.h>
|
#include <ripple/app/misc/NetworkOPs.h>
|
||||||
|
#include <ripple/basics/CountedObject.h>
|
||||||
|
#include <ripple/basics/Log.h>
|
||||||
#include <ripple/core/Config.h>
|
#include <ripple/core/Config.h>
|
||||||
|
#include <ripple/json/to_string.h>
|
||||||
#include <ripple/net/InfoSub.h>
|
#include <ripple/net/InfoSub.h>
|
||||||
|
#include <ripple/net/RPCErr.h>
|
||||||
|
#include <ripple/protocol/ErrorCodes.h>
|
||||||
|
#include <ripple/protocol/JsonFields.h>
|
||||||
|
#include <ripple/resource/Fees.h>
|
||||||
#include <ripple/resource/Manager.h>
|
#include <ripple/resource/Manager.h>
|
||||||
|
#include <ripple/rpc/RPCHandler.h>
|
||||||
#include <ripple/server/Port.h>
|
#include <ripple/server/Port.h>
|
||||||
#include <ripple/json/to_string.h>
|
#include <ripple/json/to_string.h>
|
||||||
#include <ripple/unity/websocket.h>
|
|
||||||
#include <ripple/rpc/RPCHandler.h>
|
#include <ripple/rpc/RPCHandler.h>
|
||||||
|
#include <ripple/server/Role.h>
|
||||||
|
#include <boost/asio.hpp>
|
||||||
#include <beast/asio/placeholders.h>
|
#include <beast/asio/placeholders.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
@@ -60,7 +70,7 @@ protected:
|
|||||||
|
|
||||||
virtual void preDestroy () = 0;
|
virtual void preDestroy () = 0;
|
||||||
virtual void disconnect () = 0;
|
virtual void disconnect () = 0;
|
||||||
|
|
||||||
virtual void recordMetrics (RPC::Context const&) const = 0;
|
virtual void recordMetrics (RPC::Context const&) const = 0;
|
||||||
|
|
||||||
public:
|
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<InfoSub> (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
|
} // ripple
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -22,11 +22,10 @@
|
|||||||
|
|
||||||
#include <ripple/app/main/Application.h>
|
#include <ripple/app/main/Application.h>
|
||||||
#include <ripple/app/main/CollectorManager.h>
|
#include <ripple/app/main/CollectorManager.h>
|
||||||
#include <ripple/app/websocket/WSConnection.h>
|
|
||||||
#include <ripple/protocol/JsonFields.h>
|
#include <ripple/protocol/JsonFields.h>
|
||||||
#include <ripple/server/Port.h>
|
#include <ripple/server/Port.h>
|
||||||
#include <ripple/json/json_reader.h>
|
#include <ripple/json/json_reader.h>
|
||||||
#include <ripple/unity/websocket.h>
|
#include <ripple/websocket/Connection.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
@@ -436,7 +435,7 @@ public:
|
|||||||
if (jCmd.isString())
|
if (jCmd.isString())
|
||||||
job.rename (std::string ("WSClient::") + jCmd.asString());
|
job.rename (std::string ("WSClient::") + jCmd.asString());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto const start (std::chrono::high_resolution_clock::now ());
|
auto const start (std::chrono::high_resolution_clock::now ());
|
||||||
Json::Value const jvObj (conn->invokeCommand (jvRequest));
|
Json::Value const jvObj (conn->invokeCommand (jvRequest));
|
||||||
std::string const buffer (to_string (jvObj));
|
std::string const buffer (to_string (jvObj));
|
||||||
@@ -18,9 +18,8 @@
|
|||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
#include <BeastConfig.h>
|
#include <BeastConfig.h>
|
||||||
#include <ripple/app/websocket/WSDoor.h>
|
#include <ripple/websocket/MakeServer.h>
|
||||||
#include <ripple/app/websocket/WSServerHandler.h>
|
#include <ripple/websocket/Handler.h>
|
||||||
#include <ripple/unity/websocket.h>
|
|
||||||
#include <beast/threads/Thread.h>
|
#include <beast/threads/Thread.h>
|
||||||
#include <beast/cxx14/memory.h> // <memory>
|
#include <beast/cxx14/memory.h> // <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
@@ -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 <BeastConfig.h>
|
|
||||||
|
|
||||||
// VFALCO - Empty file?
|
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
#ifndef WEBSOCKETPP_SOCKET_AUTOTLS_HPP
|
#ifndef WEBSOCKETPP_SOCKET_AUTOTLS_HPP
|
||||||
#define WEBSOCKETPP_SOCKET_AUTOTLS_HPP
|
#define WEBSOCKETPP_SOCKET_AUTOTLS_HPP
|
||||||
|
|
||||||
#include <ripple/websocket/autosocket/AutoSocket.h>
|
#include <ripple/websocket/AutoSocket.h>
|
||||||
#include <beast/asio/placeholders.h>
|
#include <beast/asio/placeholders.h>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user