diff options
Diffstat (limited to 'config.cpp')
-rw-r--r-- | config.cpp | 102 |
1 files changed, 100 insertions, 2 deletions
@@ -3,7 +3,10 @@ #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> +#include <iostream> + 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<std::string>("webserver.user"); - m_group = tree.get<std::string>("webserver.group1"); + m_group = tree.get<std::string>("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("<site> expected in <sites>"); + 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("<xmlattr>"); + path.requested = attrs.get<std::string>("requested"); + std::string type = attrs.get<std::string>("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 <xmlattr> + 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("<socket> expected in <sockets>"); + 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; +} + |