made minor changes related to qse_httpd_configmod()
This commit is contained in:
parent
49febef055
commit
652784bafb
@ -2045,7 +2045,8 @@ static qse_httpd_server_t* attach_server (qse_httpd_t* httpd, int num, qse_xli_l
|
||||
static int load_hook_modules (qse_httpd_t* httpd, qse_xli_list_t* hook_list)
|
||||
{
|
||||
qse_char_t buf[32];
|
||||
qse_xli_pair_t* pair, * cfg;
|
||||
qse_xli_pair_t* file, * cfg, * mod;
|
||||
qse_httpd_mod_t* module;
|
||||
httpd_xtn_t* httpd_xtn;
|
||||
|
||||
int i;
|
||||
@ -2055,19 +2056,59 @@ static int load_hook_modules (qse_httpd_t* httpd, qse_xli_list_t* hook_list)
|
||||
for (i = 0; ; i++)
|
||||
{
|
||||
qse_strxfmt (buf, QSE_COUNTOF(buf), QSE_T("module[%d]"), i);
|
||||
pair = qse_xli_findpair (httpd_xtn->xli, hook_list, buf);
|
||||
if (pair == QSE_NULL) break;
|
||||
mod = qse_xli_findpair (httpd_xtn->xli, hook_list, buf);
|
||||
if (mod == QSE_NULL) break;
|
||||
|
||||
pair = qse_xli_findpair (httpd_xtn->xli, (qse_xli_list_t*)pair->val, QSE_T("file"));
|
||||
if (pair == QSE_NULL)
|
||||
file = qse_xli_findpair (httpd_xtn->xli, (qse_xli_list_t*)mod->val, QSE_T("file"));
|
||||
if (file == QSE_NULL)
|
||||
{
|
||||
/* TODO: log warning when file is not found in module */
|
||||
}
|
||||
else
|
||||
{
|
||||
cfg = qse_xli_findpair (httpd_xtn->xli, (qse_xli_list_t*)pair->val, QSE_T("config"));
|
||||
qse_httpd_loadmod (httpd, ((qse_xli_str_t*)pair->val)->ptr, (cfg? cfg->val: QSE_NULL));
|
||||
/* TODO: error handling and logging */
|
||||
module = qse_httpd_loadmod (httpd, ((qse_xli_str_t*)file->val)->ptr);
|
||||
if (!module)
|
||||
{
|
||||
/* TODO: better error handling and logging */
|
||||
qse_printf (QSE_T("WARNING: failed to load module [%s]\n"), ((qse_xli_str_t*)file->val)->ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
cfg = qse_xli_findpair (httpd_xtn->xli, (qse_xli_list_t*)mod->val, QSE_T("config"));
|
||||
if (cfg)
|
||||
{
|
||||
if (!module->config)
|
||||
{
|
||||
qse_printf (QSE_T("WARNING: unneeded configuration for [%s]. no configuration handler\n"),
|
||||
((qse_xli_str_t*)file->val)->ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
const qse_xli_atom_t* atom;
|
||||
const qse_xli_pair_t* pair;
|
||||
int x;
|
||||
|
||||
for (atom = ((qse_xli_list_t*)(cfg->val))->head; atom; atom = atom->next)
|
||||
{
|
||||
if (atom->type != QSE_XLI_PAIR) continue;
|
||||
pair = (qse_xli_pair_t*)atom;
|
||||
|
||||
if (pair->val->type != QSE_XLI_STR) continue;
|
||||
x = qse_httpd_configmod (httpd, module, pair->key, ((qse_xli_str_t*)pair->val)->ptr);
|
||||
if (x <= -1)
|
||||
{
|
||||
qse_printf (QSE_T("WARNING: failed to set module configuration [%s] to [%s] for [%s]\n"),
|
||||
pair->key, ((qse_xli_str_t*)pair->val)->ptr, ((qse_xli_str_t*)file->val)->ptr);
|
||||
}
|
||||
else if (x == 0)
|
||||
{
|
||||
qse_printf (QSE_T("WARNING: invalid module configuration item [%s] for [%s]\n"),
|
||||
pair->key, ((qse_xli_str_t*)file->val)->ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2094,7 +2135,7 @@ static int open_config_file (qse_httpd_t* httpd)
|
||||
{ QSE_T("hooks.module"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYALIAS, 0, 0 } },
|
||||
{ QSE_T("hooks.module.file"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
||||
{ QSE_T("hooks.module.config"), { QSE_XLI_SCM_VALLIST |
|
||||
QSE_XLI_SCM_KEYNODUP | QSE_XLI_SCM_RELAXED, 0, 0 } },
|
||||
QSE_XLI_SCM_KEYNODUP | QSE_XLI_SCM_VALIFFY, 0, 0 } },
|
||||
|
||||
{ QSE_T("server-default"), { QSE_XLI_SCM_VALLIST | QSE_XLI_SCM_KEYNODUP, 0, 0 } },
|
||||
{ QSE_T("server-default.ssl-cert-file"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } },
|
||||
|
@ -1452,7 +1452,7 @@ struct qse_awk_nrflt_t
|
||||
};
|
||||
typedef struct qse_awk_nrflt_t qse_awk_nrflt_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -2869,7 +2869,7 @@ QSE_EXPORT qse_awk_val_t* qse_getawknilval (
|
||||
void
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -68,7 +68,7 @@ struct qse_env_t
|
||||
};
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -179,7 +179,7 @@ QSE_EXPORT int qse_env_deletembs (
|
||||
# define qse_env_delete(env,name) qse_env_deletewcs(env,name)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -162,7 +162,7 @@ struct qse_fio_lck_t
|
||||
|
||||
#define QSE_FIO_HANDLE(fio) ((fio)->handle)
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -312,7 +312,7 @@ QSE_EXPORT int qse_getstdfiohandle (
|
||||
qse_fio_hnd_t* hnd
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -81,7 +81,7 @@ struct qse_mux_evt_t
|
||||
void* data;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -124,7 +124,7 @@ QSE_EXPORT int qse_mux_poll (
|
||||
const qse_ntime_t* tmout
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -114,7 +114,7 @@ struct qse_skad_t
|
||||
qse_uintptr_t dummy;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -201,7 +201,7 @@ QSE_EXPORT int qse_skadfamily (
|
||||
const qse_skad_t* skad
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -218,7 +218,7 @@ struct qse_pio_t
|
||||
/** get the native handle from the #qse_pio_t structure */
|
||||
#define QSE_PIO_HANDLE(pio,hid) ((pio)->pin[hid].handle)
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -410,7 +410,7 @@ QSE_EXPORT int qse_pio_kill (
|
||||
qse_pio_t* pio /**< pio object */
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -364,7 +364,7 @@ enum qse_wcsfnmat_flag_t
|
||||
# define QSE_STRFNMAT_IGNORECASE QSE_WCSFNMAT_IGNORECASE
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -3318,7 +3318,7 @@ QSE_EXPORT qse_size_t qse_wcs_fmt (
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -64,7 +64,7 @@ struct qse_tmr_event_t
|
||||
#define QSE_TMR_SIZE(tmr) ((tmr)->size)
|
||||
#define QSE_TMR_CAPA(tmr) ((tmr)->capa);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -142,7 +142,7 @@ QSE_EXPORT qse_tmr_event_t* qse_tmr_getevent (
|
||||
qse_tmr_index_t index
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -109,7 +109,7 @@ struct qse_htrd_t
|
||||
int clean;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -211,7 +211,7 @@ QSE_EXPORT int qse_htrd_scanqparam (
|
||||
const qse_mcstr_t* cstr
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -152,7 +152,7 @@ typedef int (*qse_htre_header_walker_t) (
|
||||
void* ctx
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -238,7 +238,7 @@ QSE_EXPORT int qse_htre_perdecqpath (
|
||||
qse_htre_t* req
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -161,7 +161,7 @@ enum qse_perenchttpstr_opt_t
|
||||
};
|
||||
typedef enum qse_perenchttpstr_opt_t qse_perenchttpstr_opt_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -226,7 +226,7 @@ QSE_EXPORT qse_mchar_t* qse_perenchttpstrdup (
|
||||
qse_mmgr_t* mmgr
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include <qse/cmn/time.h>
|
||||
#include <qse/cmn/tmr.h>
|
||||
#include <qse/cmn/env.h>
|
||||
#include <qse/xli/xli.h>
|
||||
|
||||
typedef struct qse_httpd_t qse_httpd_t;
|
||||
typedef struct qse_httpd_mate_t qse_httpd_mate_t;
|
||||
@ -58,15 +57,17 @@ enum qse_httpd_errnum_t
|
||||
QSE_HTTPD_EPIPE,
|
||||
QSE_HTTPD_EAGAIN,
|
||||
|
||||
QSE_HTTPD_ENOSVR, /* no active servers */
|
||||
QSE_HTTPD_ECONN, /* connection failure */
|
||||
QSE_HTTPD_ESCONN, /* secure connection failure */
|
||||
QSE_HTTPD_ENOBUF, /* no buffer available */
|
||||
QSE_HTTPD_EDISCON, /* client disconnnected */
|
||||
QSE_HTTPD_EBADREQ, /* bad request */
|
||||
QSE_HTTPD_ENODNS, /* dns service not activated/enabled or no valid dns server specified */
|
||||
QSE_HTTPD_ENOURS, /* urs service not activated/enabled or no valid urs server specified */
|
||||
QSE_HTTPD_ETASK
|
||||
QSE_HTTPD_ENOSVR, /* no active servers */
|
||||
QSE_HTTPD_ECONN, /* connection failure */
|
||||
QSE_HTTPD_ESCONN, /* secure connection failure */
|
||||
QSE_HTTPD_ENOBUF, /* no buffer available */
|
||||
QSE_HTTPD_EDISCON, /* client disconnnected */
|
||||
QSE_HTTPD_EBADREQ, /* bad request */
|
||||
QSE_HTTPD_ENODNS, /* dns service not activated/enabled or no valid dns server specified */
|
||||
QSE_HTTPD_ENOURS, /* urs service not activated/enabled or no valid urs server specified */
|
||||
QSE_HTTPD_ETASK, /* general error in the task handler */
|
||||
QSE_HTTPD_ENOMODCONFIG, /* module doesn't have the config callback */
|
||||
QSE_HTTPD_EMODCFGKEY /* module configuration key is invalid or unknown */
|
||||
};
|
||||
typedef enum qse_httpd_errnum_t qse_httpd_errnum_t;
|
||||
|
||||
@ -103,14 +104,19 @@ typedef enum qse_httpd_trait_t qse_httpd_trait_t;
|
||||
typedef struct qse_httpd_mod_t qse_httpd_mod_t;
|
||||
|
||||
typedef int (*qse_httpd_mod_load_t) (
|
||||
qse_httpd_mod_t* mod,
|
||||
const qse_xli_list_t* cfg
|
||||
qse_httpd_mod_t* mod
|
||||
);
|
||||
|
||||
typedef void (*qse_httpd_mod_unload_t) (
|
||||
qse_httpd_mod_t* mod
|
||||
);
|
||||
|
||||
typedef int (*qse_httpd_mod_config_t) (
|
||||
qse_httpd_mod_t* mod,
|
||||
const qse_char_t* key,
|
||||
const qse_char_t* value
|
||||
);
|
||||
|
||||
typedef int (*qse_httpd_mod_dns_preresolve_t) (
|
||||
qse_httpd_mod_t* mod,
|
||||
qse_httpd_client_t* client,
|
||||
@ -128,10 +134,12 @@ typedef int (*qse_httpd_mod_urs_prerewrite_t) (
|
||||
|
||||
struct qse_httpd_mod_t
|
||||
{
|
||||
/* private */
|
||||
/* next and handle are for internal use only*/
|
||||
qse_httpd_mod_t* next;
|
||||
void* handle; /* set to the return value of mod.open() */
|
||||
|
||||
/* ------------------------------------------- */
|
||||
|
||||
/* module may access these fields for rererence */
|
||||
qse_httpd_t* httpd;
|
||||
qse_char_t* name; /* portable module name */
|
||||
@ -140,6 +148,8 @@ struct qse_httpd_mod_t
|
||||
/* module's entry point may set these items */
|
||||
void* ctx;
|
||||
qse_httpd_mod_unload_t unload;
|
||||
/** return -1 upon error, 0 if a key is unknown/invalid, 1 upon success */
|
||||
qse_httpd_mod_config_t config;
|
||||
qse_httpd_mod_dns_preresolve_t dns_preresolve;
|
||||
qse_httpd_mod_urs_prerewrite_t urs_prerewrite;
|
||||
|
||||
@ -1030,7 +1040,7 @@ struct qse_httpd_ecb_t
|
||||
qse_httpd_ecb_t* next;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@ -1419,10 +1429,9 @@ QSE_EXPORT int qse_httpd_rewriteurl (
|
||||
void* ctx
|
||||
);
|
||||
|
||||
QSE_EXPORT int qse_httpd_loadmod (
|
||||
QSE_EXPORT qse_httpd_mod_t* qse_httpd_loadmod (
|
||||
qse_httpd_t* httpd,
|
||||
const qse_char_t* name,
|
||||
const qse_xli_list_t* list
|
||||
const qse_char_t* name
|
||||
);
|
||||
|
||||
QSE_EXPORT qse_httpd_mod_t* qse_httpd_findmod (
|
||||
@ -1430,6 +1439,12 @@ QSE_EXPORT qse_httpd_mod_t* qse_httpd_findmod (
|
||||
const qse_char_t* name
|
||||
);
|
||||
|
||||
QSE_EXPORT int qse_httpd_configmod (
|
||||
qse_httpd_t* httpd,
|
||||
qse_httpd_mod_t* mod,
|
||||
const qse_char_t* key,
|
||||
const qse_char_t* value
|
||||
);
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
@ -1447,7 +1462,7 @@ QSE_EXPORT void qse_httpd_removetimerevent (
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -271,7 +271,7 @@ QSE_EXPORT int qse_httpd_loopstd (
|
||||
const qse_httpd_ursstd_t* urs
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -335,12 +335,20 @@ enum qse_xli_scm_flag_t
|
||||
QSE_XLI_SCM_VALNIL = (1 << 1),
|
||||
QSE_XLI_SCM_VALSTR = (1 << 2),
|
||||
QSE_XLI_SCM_VALLIST = (1 << 3),
|
||||
|
||||
QSE_XLI_SCM_KEYNODUP = (1 << 4),
|
||||
QSE_XLI_SCM_KEYALIAS = (1 << 5),
|
||||
|
||||
/* skips the validation of child pairs under a list.
|
||||
* useful with #QSE_XLI_SCM_VALLIST only. */
|
||||
QSE_XLI_SCM_RELAXED = (1 << 6)
|
||||
/** Indicates that the value is a list with uncertain definitions with
|
||||
* the following constraints:
|
||||
* no key aliases and duplicate keys are allowed.
|
||||
* only a single-segment string is allowed as a value.
|
||||
*
|
||||
* Each pair in the list is treated as if { QSE_SLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 }
|
||||
* is specified.
|
||||
*
|
||||
* Applies only if #QSE_XLI_SCM_VALLIST is set. */
|
||||
QSE_XLI_SCM_VALIFFY = (1 << 6)
|
||||
};
|
||||
typedef enum qse_xli_scm_flag_t qse_xli_scm_flag_t;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user