aboutsummaryrefslogtreecommitdiff
path: root/src/zenhttp/servers/httpmulti.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-10-13 14:46:49 +0200
committerGitHub <[email protected]>2023-10-13 14:46:49 +0200
commitc3fad0e98576ff5dee3ee63725459d46e201fa34 (patch)
tree91455786fac76ffb6a83ff24620329780ce08545 /src/zenhttp/servers/httpmulti.cpp
parentimproved http.sys initialization diagnostics and amended logic for dedicated ... (diff)
downloadzen-c3fad0e98576ff5dee3ee63725459d46e201fa34.tar.xz
zen-c3fad0e98576ff5dee3ee63725459d46e201fa34.zip
support for multiple http servers (#473)
* added support for having multiple http servers active in one session * added configuration API to pluggable transports * removed pimpl pattern from some pluggable transports implementations
Diffstat (limited to 'src/zenhttp/servers/httpmulti.cpp')
-rw-r--r--src/zenhttp/servers/httpmulti.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/zenhttp/servers/httpmulti.cpp b/src/zenhttp/servers/httpmulti.cpp
new file mode 100644
index 000000000..6b7060d5e
--- /dev/null
+++ b/src/zenhttp/servers/httpmulti.cpp
@@ -0,0 +1,115 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#include "httpmulti.h"
+
+#include <zencore/logging.h>
+
+#if ZEN_PLATFORM_WINDOWS
+# include <conio.h>
+#endif
+
+namespace zen {
+
+HttpMultiServer::HttpMultiServer()
+{
+}
+
+HttpMultiServer::~HttpMultiServer()
+{
+}
+
+void
+HttpMultiServer::RegisterService(HttpService& Service)
+{
+ for (auto& Server : m_Servers)
+ {
+ Server->RegisterService(Service);
+ }
+}
+
+int
+HttpMultiServer::Initialize(int BasePort)
+{
+ ZEN_ASSERT(!m_IsInitialized);
+
+ int EffectivePort = 0;
+
+ for (auto& Server : m_Servers)
+ {
+ const int InitializeResult = Server->Initialize(BasePort);
+
+ if (!EffectivePort)
+ {
+ EffectivePort = InitializeResult;
+ }
+ }
+
+ m_IsInitialized = true;
+
+ return EffectivePort;
+}
+
+void
+HttpMultiServer::Run(bool IsInteractiveSession)
+{
+ const bool TestMode = !IsInteractiveSession;
+
+ int WaitTimeout = -1;
+ if (!TestMode)
+ {
+ WaitTimeout = 1000;
+ }
+
+#if ZEN_PLATFORM_WINDOWS
+ if (TestMode == false)
+ {
+ zen::logging::ConsoleLog().info("Zen Server running (multi server). Press ESC or Q to quit");
+ }
+
+ do
+ {
+ if (!TestMode && _kbhit() != 0)
+ {
+ char c = (char)_getch();
+
+ if (c == 27 || c == 'Q' || c == 'q')
+ {
+ RequestApplicationExit(0);
+ }
+ }
+
+ m_ShutdownEvent.Wait(WaitTimeout);
+ } while (!IsApplicationExitRequested());
+#else
+ if (TestMode == false)
+ {
+ zen::logging::ConsoleLog().info("Zen Server running (null HTTP). Ctrl-C to quit");
+ }
+
+ do
+ {
+ m_ShutdownEvent.Wait(WaitTimeout);
+ } while (!IsApplicationExitRequested());
+#endif
+}
+
+void
+HttpMultiServer::RequestExit()
+{
+ m_ShutdownEvent.Set();
+}
+
+void
+HttpMultiServer::Close()
+{
+}
+
+void
+HttpMultiServer::AddServer(Ref<HttpServer> Server)
+{
+ ZEN_ASSERT(!m_IsInitialized);
+
+ m_Servers.push_back(std::move(Server));
+}
+
+} // namespace zen