diff options
author | Adam Chlipala <adam@chlipala.net> | 2012-08-02 16:33:25 -0400 |
---|---|---|
committer | Adam Chlipala <adam@chlipala.net> | 2012-08-02 16:33:25 -0400 |
commit | fdc6c1310be60fbeb597400618473861f78676de (patch) | |
tree | 201d14d77f7f944545809bff02ae45fc826bb7e7 /src/c/urweb.c | |
parent | 722b0c632007ac6ea178b05695974e447b4288a3 (diff) |
Basis.getenv
Diffstat (limited to 'src/c/urweb.c')
-rw-r--r-- | src/c/urweb.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/c/urweb.c b/src/c/urweb.c index 8d44088d..2eb1c9fe 100644 --- a/src/c/urweb.c +++ b/src/c/urweb.c @@ -420,6 +420,9 @@ struct uw_context { char *(*get_header)(void *, const char *); void *get_header_data; + char *(*get_env)(void *, const char *); + void *get_env_data; + uw_buffer outHeaders, page, heap, script; int allowed_to_return_indirectly, returning_indirectly; input *inputs, *subinputs, *cur_container; @@ -484,6 +487,9 @@ uw_context uw_init(int id, void *logger_data, uw_logger log_debug) { ctx->get_header = NULL; ctx->get_header_data = NULL; + ctx->get_env = NULL; + ctx->get_env_data = NULL; + uw_buffer_init(uw_headers_max, &ctx->outHeaders, 1); ctx->outHeaders.start[0] = 0; uw_buffer_init(uw_page_max, &ctx->page, 1); @@ -655,6 +661,11 @@ void uw_set_headers(uw_context ctx, char *(*get_header)(void *, const char *), v ctx->get_header_data = get_header_data; } +void uw_set_env(uw_context ctx, char *(*get_env)(void *, const char *), void *get_env_data) { + ctx->get_env = get_env; + ctx->get_env_data = get_env_data; +} + static void uw_set_error(uw_context ctx, const char *fmt, ...) { va_list ap; va_start(ap, fmt); @@ -3476,8 +3487,16 @@ uw_Basis_string uw_Basis_blessResponseHeader(uw_context ctx, uw_Basis_string s) uw_error(ctx, FATAL, "Disallowed response header %s", uw_Basis_htmlifyString(ctx, s)); } +static int envVar_format(const char *s) { + for (; *s; ++s) + if (!isalnum((int)*s) && *s != '_' && *s != '.') + return 0; + + return 1; +} + uw_Basis_string uw_Basis_checkResponseHeader(uw_context ctx, uw_Basis_string s) { - if (!mime_format(s)) + if (!envVar_format(s)) return NULL; if (ctx->app->check_responseHeader(s)) @@ -3486,6 +3505,26 @@ uw_Basis_string uw_Basis_checkResponseHeader(uw_context ctx, uw_Basis_string s) return NULL; } +uw_Basis_string uw_Basis_blessEnvVar(uw_context ctx, uw_Basis_string s) { + if (!envVar_format(s)) + uw_error(ctx, FATAL, "Environment variable \"%s\" contains invalid character", uw_Basis_htmlifyString(ctx, s)); + + if (ctx->app->check_envVar(s)) + return s; + else + uw_error(ctx, FATAL, "Disallowed environment variable %s", uw_Basis_htmlifyString(ctx, s)); +} + +uw_Basis_string uw_Basis_checkEnvVar(uw_context ctx, uw_Basis_string s) { + if (!mime_format(s)) + return NULL; + + if (ctx->app->check_envVar(s)) + return s; + else + return NULL; +} + uw_Basis_string uw_Basis_getHeader(uw_context ctx, uw_Basis_string name) { return uw_Basis_requestHeader(ctx, name); } @@ -3510,6 +3549,10 @@ uw_unit uw_Basis_setHeader(uw_context ctx, uw_Basis_string name, uw_Basis_string return uw_unit_v; } +uw_Basis_string uw_Basis_getenv(uw_context ctx, uw_Basis_string name) { + return ctx->get_env(ctx->get_env_data, name); +} + uw_Basis_string uw_unnull(uw_Basis_string s) { return s ? s : ""; } |