#pragma once #include #define _WINSOCKAPI_ #include #include "iothreadpool.h" #include #include namespace zen { /** * @brief Windows implementation of HTTP server based on http.sys * * This requires elevation to function */ class HttpSysServer { friend class HttpSysTransaction; public: HttpSysServer(WinIoThreadPool& InThreadPool); ~HttpSysServer(); void Initialize(const wchar_t* UrlPath); void Run(bool TestMode); void RequestExit() { m_ShutdownEvent.Set(); } void StartServer(); void StopServer(); void OnHandlingRequest(); void IssueNewRequestMaybe(); inline bool IsOk() const { return m_IsOk; } void AddEndpoint(const char* Endpoint, HttpService& Service); void RemoveEndpoint(const char* Endpoint, HttpService& Service); private: bool m_IsOk = false; bool m_IsHttpInitialized = false; WinIoThreadPool& m_ThreadPool; std::wstring m_BaseUri; // http://*:nnnn/ HTTP_SERVER_SESSION_ID m_HttpSessionId = 0; HTTP_URL_GROUP_ID m_HttpUrlGroupId = 0; HANDLE m_RequestQueueHandle = 0; std::atomic_int32_t m_PendingRequests{0}; int32_t m_MinPendingRequests = 4; int32_t m_MaxPendingRequests = 32; Event m_ShutdownEvent; }; }