diff options
-rw-r--r-- | src/c/urweb.c | 38 | ||||
-rw-r--r-- | src/cjr_print.sml | 28 | ||||
-rw-r--r-- | src/elaborate.sml | 3 |
3 files changed, 38 insertions, 31 deletions
diff --git a/src/c/urweb.c b/src/c/urweb.c index 382c9d77..12934509 100644 --- a/src/c/urweb.c +++ b/src/c/urweb.c @@ -728,22 +728,6 @@ failure_kind uw_begin(uw_context ctx, char *path) { return r; } -failure_kind uw_begin_onError(uw_context ctx, char *msg) { - int r = setjmp(ctx->jmp_buf); - - if (ctx->app->on_error) { - if (r == 0) { - if (ctx->app->db_begin(ctx)) - uw_error(ctx, BOUNDED_RETRY, "Error running SQL BEGIN"); - - ctx->app->on_error(ctx, msg); - } - - return r; - } else - uw_error(ctx, FATAL, "Tried to run nonexistent onError handler"); -} - uw_Basis_client uw_Basis_self(uw_context ctx) { if (ctx->client == NULL) uw_error(ctx, FATAL, "Call to Basis.self() from page that has only server-side code"); @@ -3747,3 +3731,25 @@ uw_Basis_time *uw_Basis_readUtc(uw_context ctx, uw_Basis_string s) { else return NULL; } + +static const char begin_xhtml[] = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">"; + +failure_kind uw_begin_onError(uw_context ctx, char *msg) { + int r = setjmp(ctx->jmp_buf); + + if (ctx->app->on_error) { + if (r == 0) { + if (ctx->app->db_begin(ctx)) + uw_error(ctx, BOUNDED_RETRY, "Error running SQL BEGIN"); + + uw_write_header(ctx, "HTTP/1.1 500 Internal Server Error\r\n"); + uw_write_header(ctx, "Content-type: text/html\r\n\r\n"); + uw_write(ctx, begin_xhtml); + ctx->app->on_error(ctx, msg); + uw_write(ctx, "</html>"); + } + + return r; + } else + uw_error(ctx, FATAL, "Tried to run nonexistent onError handler"); +} diff --git a/src/cjr_print.sml b/src/cjr_print.sml index 8aba232d..fffeadcc 100644 --- a/src/cjr_print.sml +++ b/src/cjr_print.sml @@ -2991,6 +2991,20 @@ fun p_file env (ds, ps) = newline, newline, + string "static const char begin_xhtml[] = \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\" ?>\\n<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Transitional//EN\\\" \\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\\\">\\n<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\" xml:lang=\\\"en\\\" lang=\\\"en\\\">\";", + newline, + newline, + + p_list_sep newline (fn x => x) pds, + newline, + newline, + string "static int uw_input_num(const char *name) {", + newline, + makeSwitch (fnums, 0), + string "}", + newline, + newline, + box (ListUtil.mapi (fn (i, (_, x1, x2, e)) => box [string "static void uw_periodic", string (Int.toString i), @@ -3021,20 +3035,6 @@ fun p_file env (ds, ps) = newline, newline, - string "static const char begin_xhtml[] = \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\" ?>\\n<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Transitional//EN\\\" \\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\\\">\\n<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\" xml:lang=\\\"en\\\" lang=\\\"en\\\">\";", - newline, - newline, - - p_list_sep newline (fn x => x) pds, - newline, - newline, - string "static int uw_input_num(const char *name) {", - newline, - makeSwitch (fnums, 0), - string "}", - newline, - newline, - makeChecker ("uw_check_url", Settings.getUrlRules ()), newline, diff --git a/src/elaborate.sml b/src/elaborate.sml index 2da34725..61a0b1c0 100644 --- a/src/elaborate.sml +++ b/src/elaborate.sml @@ -4012,7 +4012,8 @@ and elabDecl (dAll as (d, loc), (env, denv, gs)) = val xpage = (L'.CApp ((L'.CModProj (!basis_r, [], "transaction"), loc), page), loc) val func = (L'.TFun ((L'.CModProj (!basis_r, [], "xbody"), loc), xpage), loc) in - unifyCons env loc t func; + (unifyCons env loc t func + handle CUnify _ => ErrorMsg.error "onError handler has wrong type."); ([(L'.DOnError (n, ms, s), loc)], (env, denv, gs)) end) |