From d77c76724012ddaa5545a4e4e00b4feb810d8bde Mon Sep 17 00:00:00 2001 From: Francesco Date: Mon, 1 Dec 2025 04:33:03 +0100 Subject: [PATCH] refactor(config): initial support for custom error pages --- config.yaml | 8 ++++++++ include/config/config.h | 7 +++++++ src/config/config.c | 34 ++++++++++++++++++++++------------ 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/config.yaml b/config.yaml index 27ff704..60ae34d 100644 --- a/config.yaml +++ b/config.yaml @@ -5,9 +5,17 @@ virtual_hosts: - domain: localhost root: www ssl: false + error_pages: + - method: 404 + path: pages/404.html + - method: 500 + path: pages/500.html - domain: test.local root: www ssl: true cert: cert.pem key: key.pem + error_pages: + - method: 404 + path: pages/404.html diff --git a/include/config/config.h b/include/config/config.h index 7b08faf..c7938da 100644 --- a/include/config/config.h +++ b/include/config/config.h @@ -3,12 +3,19 @@ #include +typedef struct cws_error_page { + unsigned method; + const char *path; +} cws_error_page; + typedef struct cws_vhost { char *domain; char *root; bool ssl; char *cert; char *key; + cws_error_page *error_pages; + unsigned error_pages_count; } cws_vhost_s; typedef struct cws_config { diff --git a/src/config/config.c b/src/config/config.c index 96b7f0c..3b10ad5 100644 --- a/src/config/config.c +++ b/src/config/config.c @@ -11,15 +11,27 @@ static const cyaml_config_t cyaml_config = { .log_level = CYAML_LOG_WARNING, }; +static const cyaml_schema_field_t error_page_fields[] = { + CYAML_FIELD_INT("method", CYAML_FLAG_DEFAULT, cws_error_page, method), + CYAML_FIELD_STRING_PTR("path", CYAML_FLAG_POINTER, cws_error_page, path, 0, CYAML_UNLIMITED), + CYAML_FIELD_END, +}; + +static cyaml_schema_value_t error_page_schema = { + CYAML_VALUE_MAPPING(CYAML_FLAG_DEFAULT, cws_error_page, error_page_fields), +}; + static const cyaml_schema_field_t virtual_hosts_fields[] = { - CYAML_FIELD_STRING_PTR("domain", CYAML_FLAG_POINTER, struct cws_vhost, domain, 0, - CYAML_UNLIMITED), + CYAML_FIELD_STRING_PTR("domain", CYAML_FLAG_POINTER, struct cws_vhost, domain, 0, CYAML_UNLIMITED), CYAML_FIELD_STRING_PTR("root", CYAML_FLAG_POINTER, struct cws_vhost, root, 0, CYAML_UNLIMITED), CYAML_FIELD_BOOL("ssl", CYAML_FLAG_DEFAULT, struct cws_vhost, ssl), - CYAML_FIELD_STRING_PTR("cert", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, struct cws_vhost, cert, - 0, CYAML_UNLIMITED), - CYAML_FIELD_STRING_PTR("key", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, struct cws_vhost, key, - 0, CYAML_UNLIMITED), + CYAML_FIELD_STRING_PTR("cert", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, struct cws_vhost, cert, 0, + CYAML_UNLIMITED), + CYAML_FIELD_STRING_PTR("key", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, struct cws_vhost, key, 0, CYAML_UNLIMITED), + + CYAML_FIELD_SEQUENCE("error_pages", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, struct cws_vhost, error_pages, + &error_page_schema, 0, CYAML_UNLIMITED), + CYAML_FIELD_END, }; @@ -28,11 +40,10 @@ static cyaml_schema_value_t virtual_hosts_schema = { }; static const cyaml_schema_field_t top_schema_fields[] = { - CYAML_FIELD_STRING_PTR("hostname", CYAML_FLAG_POINTER, struct cws_config, hostname, 0, - CYAML_UNLIMITED), + CYAML_FIELD_STRING_PTR("hostname", CYAML_FLAG_POINTER, struct cws_config, hostname, 0, CYAML_UNLIMITED), CYAML_FIELD_STRING_PTR("port", CYAML_FLAG_POINTER, struct cws_config, port, 0, CYAML_UNLIMITED), - CYAML_FIELD_SEQUENCE("virtual_hosts", CYAML_FLAG_POINTER, struct cws_config, virtual_hosts, - &virtual_hosts_schema, 0, CYAML_UNLIMITED), + CYAML_FIELD_SEQUENCE("virtual_hosts", CYAML_FLAG_POINTER, struct cws_config, virtual_hosts, &virtual_hosts_schema, + 0, CYAML_UNLIMITED), CYAML_FIELD_END, }; @@ -44,8 +55,7 @@ cws_config_s *cws_config_init(void) { char *path = "config.yaml"; cws_config_s *config; - cyaml_err_t err = - cyaml_load_file(path, &cyaml_config, &top_schema, (cyaml_data_t **)&config, NULL); + cyaml_err_t err = cyaml_load_file(path, &cyaml_config, &top_schema, (cyaml_data_t **)&config, NULL); if (err != CYAML_OK) { CWS_LOG_ERROR("%s", cyaml_strerror(err));