From 413c7ad80324d2c70f57c5eb1974c88df2076b2f Mon Sep 17 00:00:00 2001 From: Jordan Bancino Date: Wed, 22 Mar 2023 17:00:48 +0000 Subject: [PATCH] Start building support for running multiple HTTP servers. The standard use case for this is going to be running a TLS and a non-TLS HTTP server. I can't see a need for *more* than two, but it is theoretically possible. We shouldn't have to change anything with the database or anything; it should suffice to simply spin up more HTTP servers, and they should interact with each other the same way a single HTTP server with multiple threads will. --- src/Main.c | 70 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/src/Main.c b/src/Main.c index 0d99e43..c2452c2 100644 --- a/src/Main.c +++ b/src/Main.c @@ -44,13 +44,25 @@ #include #include -static HttpServer *httpServer = NULL; +static Array *httpServers = NULL; static void TelodendriaSignalHandler(int signalNo) { + size_t i; + (void) signalNo; - HttpServerStop(httpServer); + + if (!httpServers) + { + return; + } + + for (i = 0; i < ArraySize(httpServers); i++) + { + HttpServer *server = ArrayGet(httpServers, i); + HttpServerStop(server); + } } typedef enum ArgFlag @@ -81,6 +93,10 @@ main(int argc, char **argv) struct passwd *userInfo = NULL; struct group *groupInfo = NULL; + /* HTTP server management */ + size_t i; + HttpServer *server; + /* Signal handling */ struct sigaction sigAction; @@ -269,10 +285,18 @@ main(int argc, char **argv) /* Arguments to pass into the HTTP handler */ matrixArgs.config = tConfig; + httpServers = ArrayCreate(); + if (!httpServers) + { + Log(LOG_ERR, "Error setting up HTTP server."); + exit = EXIT_FAILURE; + goto finish; + } + /* Bind the socket before possibly dropping permissions */ - httpServer = HttpServerCreate(HTTP_FLAG_NONE, tConfig->listenPort, tConfig->threads, + server = HttpServerCreate(HTTP_FLAG_NONE, tConfig->listenPort, tConfig->threads, tConfig->maxConnections, MatrixHttpHandler, &matrixArgs); - if (!httpServer) + if (!server) { Log(LOG_ERR, "Unable to create HTTP server on port %d: %s", tConfig->listenPort, strerror(errno)); @@ -280,6 +304,8 @@ main(int argc, char **argv) goto finish; } + ArrayAdd(httpServers, server); + Log(LOG_DEBUG, "Running as uid:gid: %d:%d.", getuid(), getgid()); if (tConfig->uid && tConfig->gid) @@ -386,11 +412,20 @@ main(int argc, char **argv) Log(LOG_NOTICE, "Starting server..."); - if (!HttpServerStart(httpServer)) + for (i = 0; i < ArraySize(httpServers); i++) { - Log(LOG_ERR, "Unable to start HTTP server."); - exit = EXIT_FAILURE; - goto finish; + server = ArrayGet(httpServers, i); + + if (!HttpServerStart(server)) + { + Log(LOG_ERR, "Unable to start HTTP server %lu.", i); + exit = EXIT_FAILURE; + goto finish; + } + else + { + Log(LOG_DEBUG, "Started HTTP server %lu.", i); + } } Log(LOG_INFO, "Listening on port: %d", tConfig->listenPort); @@ -406,16 +441,25 @@ main(int argc, char **argv) goto finish; } - /* Block this thread until the server is terminated by a signal + /* Block this thread until the servers are terminated by a signal * handler */ - HttpServerJoin(httpServer); + for (i = 0; i < ArraySize(httpServers); i++) + { + server = ArrayGet(httpServers, i); + HttpServerJoin(server); + } finish: Log(LOG_NOTICE, "Shutting down..."); - if (httpServer) + if (httpServers) { - HttpServerFree(httpServer); - Log(LOG_DEBUG, "Freed HTTP Server."); + for (i = 0; i < ArraySize(httpServers); i++) + { + server = ArrayGet(httpServers, i); + HttpServerStop(server); + HttpServerFree(server); + } + ArrayFree(httpServers); } if (cron)