refactor(config): initial support for custom error pages
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user