msg;
+ std::string reason;
+ if (app_.serverOkay(reason))
+ {
+ msg.status = 200;
+ msg.reason = "OK";
+ msg.body = "" + systemName() +
+ " Test page for rippled" +
+ systemName() + " Test
This page shows rippled http(s) "
+ "connectivity is working.
";
+ }
+ else
+ {
+ msg.status = 500;
+ msg.reason = "Internal Server Error";
+ msg.body = "Server cannot accept clients: " +
+ reason + "";
+ }
+ msg.version = request.version;
+ msg.headers.insert("Server", BuildInfo::getFullVersionString());
+ msg.headers.insert("Content-Type", "text/html");
+ prepare(msg, beast::http::connection::close);
+ handoff.response = std::make_shared(msg);
+ return handoff;
}
//------------------------------------------------------------------------------
diff --git a/src/ripple/rpc/impl/ServerHandlerImp.h b/src/ripple/rpc/impl/ServerHandlerImp.h
index de33b8b153..45ea0daf97 100644
--- a/src/ripple/rpc/impl/ServerHandlerImp.h
+++ b/src/ripple/rpc/impl/ServerHandlerImp.h
@@ -149,8 +149,7 @@ public:
void
onStopped (Server&);
- //--------------------------------------------------------------------------
-
+private:
Json::Value
processSession(
std::shared_ptr const& session,
@@ -167,13 +166,10 @@ public:
std::shared_ptr jobCoro,
std::string forwardedFor, std::string user);
-private:
- bool
- isWebsocketUpgrade (http_request_type const& request);
+ Handoff
+ statusResponse(http_request_type const& request) const;
+
- bool
- authorized (Port const& port,
- std::map const& h);
};
}
diff --git a/src/test/server/ServerStatus_test.cpp b/src/test/server/ServerStatus_test.cpp
new file mode 100644
index 0000000000..3ccbc39ae9
--- /dev/null
+++ b/src/test/server/ServerStatus_test.cpp
@@ -0,0 +1,187 @@
+//------------------------------------------------------------------------------
+/*
+ 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 {
+namespace test {
+
+class ServerStatus_test : public beast::unit_test::suite
+{
+public:
+ void
+ testUnauthorizedRequest()
+ {
+ using namespace jtx;
+ Env env(*this, []()
+ {
+ auto p = std::make_unique();
+ setupConfigForUnitTests(*p);
+ p->section("port_ws").set("protocol", "http,https");
+ return p;
+ }());
+ auto const port = env.app().config()["port_ws"].
+ get("port");
+ if(! BEAST_EXPECT(port))
+ return;
+
+ using namespace boost::asio;
+ using namespace beast::http;
+ io_service ios;
+ ip::tcp::resolver r{ios};
+ beast::streambuf sb;
+ response_v1 resp;
+ boost::system::error_code ec;
+
+ beast::websocket::detail::maskgen maskgen;
+ request_v1 req;
+ req.url = "/";
+ req.version = 11;
+ req.method = "GET";
+ req.headers.insert("Host", "127.0.0.1:" + to_string(*port));
+ req.headers.insert("Upgrade", "websocket");
+ std::string key = beast::websocket::detail::make_sec_ws_key(maskgen);
+ req.headers.insert("Sec-WebSocket-Key", key);
+ req.headers.insert("Sec-WebSocket-Version", "13");
+ prepare(req, connection::upgrade);
+
+ // non secure socket
+ {
+ ip::tcp::socket sock{ios};
+ connect(sock, r.resolve(
+ ip::tcp::resolver::query{"127.0.0.1", to_string(*port)}), ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ write(sock, req, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ read(sock, sb, resp, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ BEAST_EXPECT(resp.status == 401);
+ }
+
+ // secure socket
+ {
+ ssl::context ctx{ssl::context::sslv23};
+ ctx.set_verify_mode(ssl::verify_none);
+ ssl::stream ss{ios, ctx};
+ connect(ss.next_layer(), r.resolve(
+ ip::tcp::resolver::query{"127.0.0.1", to_string(*port)}));
+ ss.handshake(ssl::stream_base::client, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ write(ss, req, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ read(ss, sb, resp, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ BEAST_EXPECT(resp.status == 401);
+ }
+ }
+
+ void
+ testStatusRequest()
+ {
+ using namespace jtx;
+ Env env(*this, []()
+ {
+ auto p = std::make_unique();
+ setupConfigForUnitTests(*p);
+ p->section("port_ws").set("protocol", "ws2,wss2");
+ return p;
+ }());
+ auto const port = env.app().config()["port_ws"].
+ get("port");
+ if(! BEAST_EXPECT(port))
+ return;
+
+ using namespace boost::asio;
+ using namespace beast::http;
+ io_service ios;
+ ip::tcp::resolver r{ios};
+ beast::streambuf sb;
+ response_v1 resp;
+ boost::system::error_code ec;
+
+ request_v1 req;
+ req.url = "/";
+ req.version = 11;
+ req.method = "GET";
+ req.headers.insert("Host", "127.0.0.1:" + to_string(*port));
+ req.headers.insert("User-Agent", "test");
+ prepare(req);
+
+ // Request the status page on a non secure socket
+ {
+ ip::tcp::socket sock{ios};
+ connect(sock, r.resolve(
+ ip::tcp::resolver::query{"127.0.0.1", to_string(*port)}), ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ write(sock, req, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ read(sock, sb, resp, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ BEAST_EXPECT(resp.status == 200);
+ }
+
+ // Request the status page on a secure socket
+ {
+ ssl::context ctx{ssl::context::sslv23};
+ ctx.set_verify_mode(ssl::verify_none);
+ ssl::stream ss{ios, ctx};
+ connect(ss.next_layer(), r.resolve(
+ ip::tcp::resolver::query{"127.0.0.1", to_string(*port)}));
+ ss.handshake(ssl::stream_base::client, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ write(ss, req, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ read(ss, sb, resp, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ BEAST_EXPECT(resp.status == 200);
+ }
+ };
+
+ void
+ run()
+ {
+ testUnauthorizedRequest();
+ testStatusRequest();
+ };
+};
+
+BEAST_DEFINE_TESTSUITE(ServerStatus, server, ripple);
+
+} // test
+} // ripple
+
diff --git a/src/unity/server_test_unity.cpp b/src/unity/server_test_unity.cpp
index 1d52762897..1cb2570f1e 100644
--- a/src/unity/server_test_unity.cpp
+++ b/src/unity/server_test_unity.cpp
@@ -18,4 +18,5 @@
*/
//==============================================================================
-#include
\ No newline at end of file
+#include
+#include