summaryrefslogtreecommitdiff
path: root/src/c/urweb.c
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2012-08-02 16:33:25 -0400
committerGravatar Adam Chlipala <adam@chlipala.net>2012-08-02 16:33:25 -0400
commit342c17de79e7624affa866ee9eab9027453ae99e (patch)
tree201d14d77f7f944545809bff02ae45fc826bb7e7 /src/c/urweb.c
parent6a1cc9086991449cf027277849cfe69450be5876 (diff)
Basis.getenv
Diffstat (limited to 'src/c/urweb.c')
-rw-r--r--src/c/urweb.c45
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 : "";
}