// Copyright Epic Games, Inc. All Rights Reserved. #include "httpmulti.h" #include #include #if ZEN_PLATFORM_WINDOWS # include #endif namespace zen { HttpMultiServer::HttpMultiServer() { } HttpMultiServer::~HttpMultiServer() { } void HttpMultiServer::OnRegisterService(HttpService& Service) { for (auto& Server : m_Servers) { Server->RegisterService(Service); } } int HttpMultiServer::OnInitialize(int BasePort, std::filesystem::path DataDir) { ZEN_TRACE_CPU("HttpMultiServer::Initialize"); ZEN_UNUSED(DataDir); ZEN_ASSERT(!m_IsInitialized); int EffectivePort = 0; for (auto& Server : m_Servers) { const int InitializeResult = Server->Initialize(BasePort, DataDir); if (!EffectivePort) { EffectivePort = InitializeResult; } } m_IsInitialized = true; return EffectivePort; } void HttpMultiServer::OnSetHttpRequestFilter(IHttpRequestFilter* RequestFilter) { for (auto& Server : m_Servers) { Server->SetHttpRequestFilter(RequestFilter); } } void HttpMultiServer::OnRun(bool IsInteractiveSession) { const int WaitTimeout = 1000; bool ShutdownRequested = false; #if ZEN_PLATFORM_WINDOWS if (IsInteractiveSession) { ZEN_CONSOLE("Zen Server running (multi server). Press ESC or Q to quit"); } do { if (IsInteractiveSession && _kbhit() != 0) { char c = (char)_getch(); if (c == 27 || c == 'Q' || c == 'q') { m_ShutdownEvent.Set(); RequestApplicationExit(0); } } ShutdownRequested = m_ShutdownEvent.Wait(WaitTimeout); } while (!ShutdownRequested); #else if (IsInteractiveSession) { ZEN_CONSOLE("Zen Server running (null HTTP). Ctrl-C to quit"); } do { ShutdownRequested = m_ShutdownEvent.Wait(WaitTimeout); } while (!ShutdownRequested); #endif } void HttpMultiServer::OnRequestExit() { m_ShutdownEvent.Set(); } void HttpMultiServer::OnClose() { for (auto& Server : m_Servers) { Server->Close(); } } std::string HttpMultiServer::OnGetExternalHost() const { if (!m_Servers.empty()) { return std::string(m_Servers.front()->GetExternalHost()); } return HttpServer::OnGetExternalHost(); } void HttpMultiServer::AddServer(Ref Server) { ZEN_ASSERT(!m_IsInitialized); m_Servers.push_back(std::move(Server)); } } // namespace zen