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