From 12972923e74e3dd174f3ce3e59c2db5ca9b400eb Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Fri, 3 Apr 2020 19:23:29 +0200 Subject: Configuration --- config.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 2 deletions(-) (limited to 'config.cpp') diff --git a/config.cpp b/config.cpp index edbe3c4..c71ce9e 100644 --- a/config.cpp +++ b/config.cpp @@ -3,7 +3,10 @@ #include #include +#include + namespace pt = boost::property_tree; +using namespace std::string_literals; void Config::readConfigfile(std::string filename) { @@ -13,15 +16,80 @@ void Config::readConfigfile(std::string filename) pt::ptree tree; - pt::read_xml(filename, tree); + pt::read_xml(filename, tree, pt::xml_parser::no_comments | pt::xml_parser::trim_whitespace); + // mandatory m_user = tree.get("webserver.user"); - m_group = tree.get("webserver.group1"); + m_group = tree.get("webserver.group"); + + // optional entries + auto elements = tree.get_child_optional("webserver"); + if (elements) { + for (const auto& element: *elements) { + if (element.first == "plugin-directory"s) { + m_plugin_directories.push_back(element.second.data()); + } else if (element.first == "sites"s) { + for (const auto& site: element.second) { + if (site.first != "site"s) + throw std::runtime_error(" expected in "); + Site site_struct; + for (const auto& x: site.second) { + if (x.first == "name"s) { + site_struct.name = x.second.data(); + } else if (x.first == "host"s) { + site_struct.host = x.second.data(); + } else if (x.first == "path"s) { + Path path; + auto attrs = x.second.get_child(""); + path.requested = attrs.get("requested"); + std::string type = attrs.get("type"); + if (type == "files") { + path.type = Files; + } else if (type == "plugin") { + path.type = Plugin; + } else + throw std::runtime_error("Unknown type: "s + type); + for (const auto& param: x.second) { + if (param.first.size() > 0 && param.first[0] != '<') // exclude meta-elements like + path.params[param.first.data()] = param.second.data(); + } + site_struct.paths.push_back(path); + } else + throw std::runtime_error("Unknown element: "s + x.first); + } + m_sites.push_back(site_struct); + } + } else if (element.first == "sockets"s) { + for (const auto& socket: element.second) { + if (socket.first != "socket"s) + throw std::runtime_error(" expected in "); + Socket socket_struct; + for (const auto& x: socket.second) { + if (x.first == "address"s) { + socket_struct.address = x.second.data(); + } else if (x.first == "port"s) { + socket_struct.port = x.second.data(); + } else if (x.first == "protocol"s) { + if (x.second.data() == "http"s) + socket_struct.protocol = HTTP; + else if (x.second.data() == "https"s) + socket_struct.protocol = HTTPS; + else + throw std::runtime_error("Unknown protocol: "s + x.second.data()); + } else + throw std::runtime_error("Unknown element: "s + x.first); + } + m_sockets.push_back(socket_struct); + } + } + } + } } Config::Config(const std::string& filename) { readConfigfile(filename); + dump(); } std::string Config::User() const @@ -33,3 +101,33 @@ std::string Config::Group() const { return m_group; } + +void Config::dump() const +{ + std::cout << "=== Configuration ===========================" << std::endl; + std::cout << "User: " << m_user << std::endl; + std::cout << "Group: " << m_user << std::endl; + + std::cout << "Plugin Directories:"; + for (const auto& dir: m_plugin_directories) + std::cout << " " << dir; + std::cout << std::endl; + + for (const auto& site: m_sites) { + std::cout << "Site: " << site.name << ": " << site.host << std::endl; + if (site.paths.size() == 0) + std::cout << " Warning: No paths configured." << std::endl; + for (const auto& path: site.paths) { + std::cout << " Path: " << path.requested << " -> " << ((path.type == Files) ? "files" : "plugin") << std::endl; + for (const auto& param: path.params) { + std::cout << " " << param.first << ": " << param.second << std::endl; + } + } + } + + for (const auto& socket: m_sockets) { + std::cout << "Socket: " << socket.address << ":" << socket.port << " (" << (socket.protocol == HTTP ? "HTTP" : "HTTPS") << ")" << std::endl; + } + std::cout << "=============================================" << std::endl; +} + -- cgit v1.2.3