Selaa lähdekoodia

WebServer: Move server configuration into WebServer::Configuration

This moves the configuration of the web server, which currently only
consists of the root path, into a new class, Configuration. Since the
configuration is global and not per client, it is accessed by a
singleton getter.

This change simplifies future extensions of the configurable parameters.
Max Wipfli 4 vuotta sitten
vanhempi
commit
e77ca79897

+ 1 - 0
Userland/Services/WebServer/CMakeLists.txt

@@ -1,5 +1,6 @@
 set(SOURCES
     Client.cpp
+    Configuration.cpp
     main.cpp
 )
 

+ 4 - 5
Userland/Services/WebServer/Client.cpp

@@ -5,7 +5,6 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
-#include "Client.h"
 #include <AK/Base64.h>
 #include <AK/Debug.h>
 #include <AK/LexicalPath.h>
@@ -21,16 +20,17 @@
 #include <LibCore/MimeData.h>
 #include <LibHTTP/HttpRequest.h>
 #include <LibHTTP/HttpResponse.h>
+#include <WebServer/Client.h>
+#include <WebServer/Configuration.h>
 #include <stdio.h>
 #include <sys/stat.h>
 #include <unistd.h>
 
 namespace WebServer {
 
-Client::Client(NonnullRefPtr<Core::TCPSocket> socket, String const& root, Core::Object* parent)
+Client::Client(NonnullRefPtr<Core::TCPSocket> socket, Core::Object* parent)
     : Core::Object(parent)
     , m_socket(socket)
-    , m_root_path(root)
 {
 }
 
@@ -84,8 +84,7 @@ void Client::handle_request(ReadonlyBytes raw_request)
     dbgln_if(WEBSERVER_DEBUG, "Canonical requested path: '{}'", requested_path);
 
     StringBuilder path_builder;
-    path_builder.append(m_root_path);
-    path_builder.append('/');
+    path_builder.append(Configuration::the().root_path());
     path_builder.append(requested_path);
     auto real_path = path_builder.to_string();
 

+ 1 - 2
Userland/Services/WebServer/Client.h

@@ -19,7 +19,7 @@ public:
     void start();
 
 private:
-    Client(NonnullRefPtr<Core::TCPSocket>, String const&, Core::Object* parent);
+    Client(NonnullRefPtr<Core::TCPSocket>, Core::Object* parent);
 
     void handle_request(ReadonlyBytes);
     void send_response(InputStream&, HTTP::HttpRequest const&, String const& content_type);
@@ -30,7 +30,6 @@ private:
     void handle_directory_listing(String const& requested_path, String const& real_path, HTTP::HttpRequest const&);
 
     NonnullRefPtr<Core::TCPSocket> m_socket;
-    String m_root_path;
 };
 
 }

+ 26 - 0
Userland/Services/WebServer/Configuration.cpp

@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2021, Max Wipfli <mail@maxwipfli.ch>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <WebServer/Configuration.h>
+
+namespace WebServer {
+
+static Configuration* s_configuration = nullptr;
+
+Configuration::Configuration(String root_path)
+    : m_root_path(move(root_path))
+{
+    VERIFY(!s_configuration);
+    s_configuration = this;
+}
+
+Configuration const& Configuration::the()
+{
+    VERIFY(s_configuration);
+    return *s_configuration;
+}
+
+}

+ 27 - 0
Userland/Services/WebServer/Configuration.h

@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2021, Max Wipfli <mail@maxwipfli.ch>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/String.h>
+
+namespace WebServer {
+
+class Configuration {
+public:
+    Configuration(String root_path);
+
+    String const& root_path() const { return m_root_path; }
+
+    void set_root_path(String root_path) { m_root_path = move(root_path); }
+
+    static Configuration const& the();
+
+private:
+    String m_root_path;
+};
+
+}

+ 6 - 2
Userland/Services/WebServer/main.cpp

@@ -1,15 +1,17 @@
 /*
  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2021, Max Wipfli <mail@maxwipfli.ch>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
-#include "Client.h"
 #include <AK/MappedFile.h>
 #include <LibCore/ArgsParser.h>
 #include <LibCore/EventLoop.h>
 #include <LibCore/File.h>
 #include <LibCore/TCPServer.h>
+#include <WebServer/Client.h>
+#include <WebServer/Configuration.h>
 #include <stdio.h>
 #include <unistd.h>
 
@@ -51,6 +53,8 @@ int main(int argc, char** argv)
         return 1;
     }
 
+    WebServer::Configuration configuration(real_root_path);
+
     Core::EventLoop loop;
 
     auto server = Core::TCPServer::construct();
@@ -58,7 +62,7 @@ int main(int argc, char** argv)
     server->on_ready_to_accept = [&] {
         auto client_socket = server->accept();
         VERIFY(client_socket);
-        auto client = WebServer::Client::construct(client_socket.release_nonnull(), real_root_path, server);
+        auto client = WebServer::Client::construct(client_socket.release_nonnull(), server);
         client->start();
     };