diff --git a/include/config/config.h b/include/config/config.h index 4066933..19f9303 100644 --- a/include/config/config.h +++ b/include/config/config.h @@ -22,6 +22,7 @@ typedef struct cws_config { int workers; cws_vhost_s *virtual_hosts; unsigned virtual_hosts_count; + cws_vhost_s *default_vh; } cws_config_s; cws_config_s *cws_config_init(void); diff --git a/src/config/config.c b/src/config/config.c index 231e99a..4179d12 100644 --- a/src/config/config.c +++ b/src/config/config.c @@ -6,23 +6,44 @@ #include "utils/debug.h" +static bool is_default(const char *domain) { + if (!strcmp(domain, "default")) { + return true; + } + + return false; +} + static bool parse_vhosts(cws_config_s *config, toml_result_t result) { toml_datum_t vhosts = toml_seek(result.toptab, "virtual_hosts"); + + /* Retrieve virtual hosts counter */ config->virtual_hosts_count = vhosts.u.arr.size; + + /* Allocate virtual hosts array */ config->virtual_hosts = malloc(sizeof *config->virtual_hosts * config->virtual_hosts_count); if (!config->virtual_hosts) { return false; } + /* Iterate for each virtual host */ for (int i = 0; i < vhosts.u.arr.size; ++i) { cws_vhost_s *vh = &config->virtual_hosts[i]; toml_datum_t elem = vhosts.u.arr.elem[i]; + + /* Retrieve vh's domain */ toml_datum_t domain = toml_seek(elem, "domain"); vh->domain = strdup(domain.u.str.ptr); if (!vh->domain) { return false; } + /* Check if vh->domain is the default domain */ + if (is_default(vh->domain)) { + config->default_vh = vh; + } + + /* Retrieve vh's root folder */ toml_datum_t root = toml_seek(elem, "root"); vh->root = strdup(root.u.str.ptr); if (!vh->root) { @@ -32,13 +53,17 @@ static bool parse_vhosts(cws_config_s *config, toml_result_t result) { /* Pages */ toml_datum_t pages = toml_seek(elem, "pages"); vh->error_pages_count = pages.u.arr.size; + + /* Allocate error pages array */ vh->error_pages = malloc(sizeof *vh->error_pages * vh->error_pages_count); if (!vh->error_pages) { return false; } + /* Iterate for each page */ for (int j = 0; j < pages.u.arr.size; ++j) { toml_datum_t page = pages.u.arr.elem[i]; + toml_datum_t status = toml_seek(page, "status"); vh->error_pages[j].status = strdup(status.u.str.ptr); if (!vh->error_pages[i].status) { @@ -56,17 +81,6 @@ static bool parse_vhosts(cws_config_s *config, toml_result_t result) { return true; } -static bool find_default(cws_config_s *config) { - for (unsigned i = 0; i < config->virtual_hosts_count; ++i) { - cws_vhost_s *vh = config->virtual_hosts; - if (!strcmp(vh[i].domain, "default")) { - return true; - } - } - - return false; -} - static bool parse_toml(cws_config_s *config) { const char *path = "config.toml"; @@ -98,15 +112,14 @@ static bool parse_toml(cws_config_s *config) { toml_datum_t workers = toml_seek(result.toptab, "server.workers"); config->workers = workers.u.int64; - parse_vhosts(config, result); - + bool ret = parse_vhosts(config, result); toml_free(result); - return find_default(config); + return ret; } cws_config_s *cws_config_init(void) { - cws_config_s *config = malloc(sizeof *config); + cws_config_s *config = calloc(1, sizeof *config); if (!config) { return NULL; } diff --git a/src/core/worker.c b/src/core/worker.c index f188114..15e8c9a 100644 --- a/src/core/worker.c +++ b/src/core/worker.c @@ -35,9 +35,8 @@ static cws_vhost_s *get_vhost(cws_config_s *config, char *host) { } } - /* Return first domain */ - /* TODO: return default domain */ - return &config->virtual_hosts[0]; + /* Return default domain */ + return config->default_vh; } static cws_return worker_handle_client_data(int epfd, int client_fd, cws_config_s *config) {