refactor(config): initial support for custom error pages

This commit is contained in:
2025-12-01 04:33:03 +01:00
parent fc0dce9574
commit d77c767240
3 changed files with 37 additions and 12 deletions

View File

@@ -5,9 +5,17 @@ virtual_hosts:
- domain: localhost - domain: localhost
root: www root: www
ssl: false ssl: false
error_pages:
- method: 404
path: pages/404.html
- method: 500
path: pages/500.html
- domain: test.local - domain: test.local
root: www root: www
ssl: true ssl: true
cert: cert.pem cert: cert.pem
key: key.pem key: key.pem
error_pages:
- method: 404
path: pages/404.html

View File

@@ -3,12 +3,19 @@
#include <stdbool.h> #include <stdbool.h>
typedef struct cws_error_page {
unsigned method;
const char *path;
} cws_error_page;
typedef struct cws_vhost { typedef struct cws_vhost {
char *domain; char *domain;
char *root; char *root;
bool ssl; bool ssl;
char *cert; char *cert;
char *key; char *key;
cws_error_page *error_pages;
unsigned error_pages_count;
} cws_vhost_s; } cws_vhost_s;
typedef struct cws_config { typedef struct cws_config {

View File

@@ -11,15 +11,27 @@ static const cyaml_config_t cyaml_config = {
.log_level = CYAML_LOG_WARNING, .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[] = { static const cyaml_schema_field_t virtual_hosts_fields[] = {
CYAML_FIELD_STRING_PTR("domain", CYAML_FLAG_POINTER, struct cws_vhost, domain, 0, CYAML_FIELD_STRING_PTR("domain", CYAML_FLAG_POINTER, struct cws_vhost, domain, 0, CYAML_UNLIMITED),
CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR("root", CYAML_FLAG_POINTER, struct cws_vhost, root, 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_BOOL("ssl", CYAML_FLAG_DEFAULT, struct cws_vhost, ssl),
CYAML_FIELD_STRING_PTR("cert", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, struct cws_vhost, cert, CYAML_FIELD_STRING_PTR("cert", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, struct cws_vhost, cert, 0,
0, CYAML_UNLIMITED), CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR("key", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, struct cws_vhost, key, CYAML_FIELD_STRING_PTR("key", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, struct cws_vhost, key, 0, CYAML_UNLIMITED),
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, CYAML_FIELD_END,
}; };
@@ -28,11 +40,10 @@ static cyaml_schema_value_t virtual_hosts_schema = {
}; };
static const cyaml_schema_field_t top_schema_fields[] = { static const cyaml_schema_field_t top_schema_fields[] = {
CYAML_FIELD_STRING_PTR("hostname", CYAML_FLAG_POINTER, struct cws_config, hostname, 0, CYAML_FIELD_STRING_PTR("hostname", CYAML_FLAG_POINTER, struct cws_config, hostname, 0, CYAML_UNLIMITED),
CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR("port", CYAML_FLAG_POINTER, struct cws_config, port, 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, CYAML_FIELD_SEQUENCE("virtual_hosts", CYAML_FLAG_POINTER, struct cws_config, virtual_hosts, &virtual_hosts_schema,
&virtual_hosts_schema, 0, CYAML_UNLIMITED), 0, CYAML_UNLIMITED),
CYAML_FIELD_END, CYAML_FIELD_END,
}; };
@@ -44,8 +55,7 @@ cws_config_s *cws_config_init(void) {
char *path = "config.yaml"; char *path = "config.yaml";
cws_config_s *config; cws_config_s *config;
cyaml_err_t err = cyaml_err_t err = cyaml_load_file(path, &cyaml_config, &top_schema, (cyaml_data_t **)&config, NULL);
cyaml_load_file(path, &cyaml_config, &top_schema, (cyaml_data_t **)&config, NULL);
if (err != CYAML_OK) { if (err != CYAML_OK) {
CWS_LOG_ERROR("%s", cyaml_strerror(err)); CWS_LOG_ERROR("%s", cyaml_strerror(err));