summaryrefslogtreecommitdiff
path: root/http/app.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'http/app.hpp')
-rw-r--r--http/app.hpp88
1 files changed, 42 insertions, 46 deletions
diff --git a/http/app.hpp b/http/app.hpp
index eeb331ea96..d7863f6b17 100644
--- a/http/app.hpp
+++ b/http/app.hpp
@@ -8,6 +8,8 @@
#include "routing.hpp"
#include "utility.hpp"
+#include <systemd/sd-daemon.h>
+
#include <boost/asio/io_context.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl/context.hpp>
@@ -31,9 +33,11 @@ class App
{
public:
using ssl_socket_t = boost::beast::ssl_stream<boost::asio::ip::tcp::socket>;
- using ssl_server_t = Server<App, ssl_socket_t>;
- using socket_t = boost::asio::ip::tcp::socket;
- using server_t = Server<App, socket_t>;
+ using raw_socket_t = boost::asio::ip::tcp::socket;
+
+ using socket_type =
+ std::conditional_t<bmcwebEnableTLS, ssl_socket_t, raw_socket_t>;
+ using server_type = Server<App, socket_type>;
explicit App(std::shared_ptr<boost::asio::io_context> ioIn =
std::make_shared<boost::asio::io_context>()) :
@@ -74,52 +78,53 @@ class App
return router.newRuleTagged<Tag>(std::move(rule));
}
- App& socket(int existingSocket)
- {
- socketFd = existingSocket;
- return *this;
- }
-
- App& port(std::uint16_t port)
- {
- portUint = port;
- return *this;
- }
-
void validate()
{
router.validate();
}
- void run()
+ std::optional<boost::asio::ip::tcp::acceptor> setupSocket()
{
- validate();
-#ifdef BMCWEB_ENABLE_SSL
- if (-1 == socketFd)
+ if (io == nullptr)
{
- sslServer = std::make_unique<ssl_server_t>(this, portUint,
- sslContext, io);
+ BMCWEB_LOG_CRITICAL("IO was nullptr?");
+ return std::nullopt;
}
- else
+ constexpr int defaultPort = 18080;
+ int listenFd = sd_listen_fds(0);
+ if (listenFd == 1)
{
- sslServer = std::make_unique<ssl_server_t>(this, socketFd,
- sslContext, io);
+ BMCWEB_LOG_INFO("attempting systemd socket activation");
+ if (sd_is_socket_inet(SD_LISTEN_FDS_START, AF_UNSPEC, SOCK_STREAM,
+ 1, 0) != 0)
+ {
+ BMCWEB_LOG_INFO("Starting webserver on socket handle {}",
+ SD_LISTEN_FDS_START);
+ return boost::asio::ip::tcp::acceptor(
+ *io, boost::asio::ip::tcp::v6(), SD_LISTEN_FDS_START);
+ }
+ BMCWEB_LOG_ERROR(
+ "bad incoming socket, starting webserver on port {}",
+ defaultPort);
}
- sslServer->run();
+ BMCWEB_LOG_INFO("Starting webserver on port {}", defaultPort);
+ return boost::asio::ip::tcp::acceptor(
+ *io, boost::asio::ip::tcp::endpoint(
+ boost::asio::ip::make_address("0.0.0.0"), defaultPort));
+ }
-#else
+ void run()
+ {
+ validate();
- if (-1 == socketFd)
+ std::optional<boost::asio::ip::tcp::acceptor> acceptor = setupSocket();
+ if (!acceptor)
{
- server = std::make_unique<server_t>(this, portUint, nullptr, io);
- }
- else
- {
- server = std::make_unique<server_t>(this, socketFd, nullptr, io);
+ BMCWEB_LOG_CRITICAL("Couldn't start server");
+ return;
}
+ server.emplace(this, std::move(*acceptor), sslContext, io);
server->run();
-
-#endif
}
void stop()
@@ -160,19 +165,10 @@ class App
private:
std::shared_ptr<boost::asio::io_context> io;
-#ifdef BMCWEB_ENABLE_SSL
- uint16_t portUint = 443;
-#else
- uint16_t portUint = 80;
-#endif
- int socketFd = -1;
- Router router;
-#ifdef BMCWEB_ENABLE_SSL
- std::unique_ptr<ssl_server_t> sslServer;
-#else
- std::unique_ptr<server_t> server;
-#endif
+ std::optional<server_type> server;
+
+ Router router;
};
} // namespace crow
using App = crow::App;