aboutsummaryrefslogtreecommitdiff
path: root/src/zenhttp/httpserver.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2026-03-10 17:48:25 +0100
committerStefan Boberg <[email protected]>2026-03-10 17:48:25 +0100
commit764141632333dd0201241f0f4edfed27f66253d2 (patch)
treecb78c5ff15205ccf5b46dafe81ea0539b97e3ffa /src/zenhttp/httpserver.cpp
parentadded support in httpasio for Unix domain sockets (diff)
parentHttpClient using libcurl, Unix Sockets for HTTP. HTTPS support (#770) (diff)
downloadzen-764141632333dd0201241f0f4edfed27f66253d2.tar.xz
zen-764141632333dd0201241f0f4edfed27f66253d2.zip
merge from main
Diffstat (limited to 'src/zenhttp/httpserver.cpp')
-rw-r--r--src/zenhttp/httpserver.cpp58
1 files changed, 51 insertions, 7 deletions
diff --git a/src/zenhttp/httpserver.cpp b/src/zenhttp/httpserver.cpp
index bbb7cd695..1a0018908 100644
--- a/src/zenhttp/httpserver.cpp
+++ b/src/zenhttp/httpserver.cpp
@@ -28,6 +28,7 @@
#include <zencore/thread.h>
#include <zenhttp/packageformat.h>
#include <zentelemetry/otlptrace.h>
+#include <zentelemetry/stats.h>
#include <charconv>
#include <mutex>
@@ -1043,13 +1044,16 @@ HttpServer::OnGetExternalHost() const
std::string
HttpServer::GetServiceUri(const HttpService* Service) const
{
+ const char* Scheme = (m_EffectiveHttpsPort > 0) ? "https" : "http";
+ int Port = (m_EffectiveHttpsPort > 0) ? m_EffectiveHttpsPort : m_EffectivePort;
+
if (Service)
{
- return fmt::format("http://{}:{}{}", m_ExternalHost, m_EffectivePort, Service->BaseUri());
+ return fmt::format("{}://{}:{}{}", Scheme, m_ExternalHost, Port, Service->BaseUri());
}
else
{
- return fmt::format("http://{}:{}", m_ExternalHost, m_EffectivePort);
+ return fmt::format("{}://{}:{}", Scheme, m_ExternalHost, Port);
}
}
@@ -1094,6 +1098,39 @@ HttpServer::SetHttpRequestFilter(IHttpRequestFilter* RequestFilter)
OnSetHttpRequestFilter(RequestFilter);
}
+CbObject
+HttpServer::CollectStats()
+{
+ CbObjectWriter Cbo;
+
+ metrics::EmitSnapshot("requests", m_RequestMeter, Cbo);
+
+ Cbo.BeginObject("bytes");
+ {
+ Cbo << "received" << GetTotalBytesReceived();
+ Cbo << "sent" << GetTotalBytesSent();
+ }
+ Cbo.EndObject();
+
+ Cbo.BeginObject("websockets");
+ {
+ Cbo << "active_connections" << GetActiveWebSocketConnectionCount();
+ Cbo << "frames_received" << m_WsFramesReceived.load(std::memory_order_relaxed);
+ Cbo << "frames_sent" << m_WsFramesSent.load(std::memory_order_relaxed);
+ Cbo << "bytes_received" << m_WsBytesReceived.load(std::memory_order_relaxed);
+ Cbo << "bytes_sent" << m_WsBytesSent.load(std::memory_order_relaxed);
+ }
+ Cbo.EndObject();
+
+ return Cbo.Save();
+}
+
+void
+HttpServer::HandleStatsRequest(HttpServerRequest& Request)
+{
+ Request.WriteResponse(HttpResponseCode::OK, CollectStats());
+}
+
//////////////////////////////////////////////////////////////////////////
HttpRpcHandler::HttpRpcHandler()
@@ -1118,10 +1155,13 @@ CreateHttpServerClass(const std::string_view ServerClass, const HttpServerConfig
if (ServerClass == "asio"sv)
{
ZEN_INFO("using asio HTTP server implementation")
- return CreateHttpAsioServer(AsioConfig{.ThreadCount = Config.ThreadCount,
- .ForceLoopback = Config.ForceLoopback,
- .IsDedicatedServer = Config.IsDedicatedServer,
- .UnixSocketPath = Config.UnixSocketPath});
+ return CreateHttpAsioServer(AsioConfig {
+ .ThreadCount = Config.ThreadCount, .ForceLoopback = Config.ForceLoopback, .IsDedicatedServer = Config.IsDedicatedServer,
+ .UnixSocketPath = Config.UnixSocketPath,
+#if ZEN_USE_OPENSSL
+ .HttpsPort = Config.HttpsPort, .CertFile = Config.CertFile, .KeyFile = Config.KeyFile,
+#endif
+ });
}
#if ZEN_WITH_HTTPSYS
else if (ServerClass == "httpsys"sv)
@@ -1132,7 +1172,11 @@ CreateHttpServerClass(const std::string_view ServerClass, const HttpServerConfig
.IsAsyncResponseEnabled = Config.HttpSys.IsAsyncResponseEnabled,
.IsRequestLoggingEnabled = Config.HttpSys.IsRequestLoggingEnabled,
.IsDedicatedServer = Config.IsDedicatedServer,
- .ForceLoopback = Config.ForceLoopback}));
+ .ForceLoopback = Config.ForceLoopback,
+ .HttpsPort = Config.HttpSys.HttpsPort,
+ .CertThumbprint = Config.HttpSys.CertThumbprint,
+ .CertStoreName = Config.HttpSys.CertStoreName,
+ .HttpsOnly = Config.HttpSys.HttpsOnly}));
}
#endif
else if (ServerClass == "null"sv)