feat: add configurable UCE error pages

This commit is contained in:
udo
2026-06-12 08:59:09 +00:00
parent b957a2373b
commit 941f5aea08
12 changed files with 352 additions and 1 deletions
+28
View File
@@ -71,6 +71,30 @@ void render_request_failure(Request& request, String title, String details, Stri
Request* previous_context = set_active_request(request);
clear_request_output(request);
if(!request.resources.is_cli)
{
DTree error_info;
error_info["type"] = "runtime_error";
error_info["title"] = title;
error_info["details"] = details;
error_info["source"] = request.params["SCRIPT_FILENAME"];
error_info["request_uri"] = first(request.params["REQUEST_URI"], request.params["SCRIPT_FILENAME"]);
if(request.server && request.params["SCRIPT_FILENAME"] != "")
error_info["generated_cpp"] = compiler_generated_cpp_path(&request, request.params["SCRIPT_FILENAME"]);
if(request_fault_signal != 0)
{
error_info["signal"] = (f64)request_fault_signal;
error_info["signal_name"] = signal_name((int)request_fault_signal);
}
error_info["trace"] = trace;
if(compiler_render_error_page(&request, "page_runtime_error", status_code, "Internal Server Error", error_info))
{
request.err = "UCE runtime error: " + title + (details != "" ? " (" + details + ")" : "");
restore_active_request(previous_context);
return;
}
}
String body;
body += "UCE runtime error\n";
body += "Request: " + first(request.params["REQUEST_URI"], request.params["SCRIPT_FILENAME"]) + "\n";
@@ -902,6 +926,9 @@ int handle_complete(FastCGIRequest& request) {
failure_title = "fatal signal during request";
failure_details = "worker recovered before closing the upstream connection";
failure_trace = backtrace_frames_string(request_fault_frames, request_fault_frame_count, 1);
// The siglongjmp skipped UnitInvocationScope's destructor, so the
// worker may still sit in the crashed unit's source directory.
cwd_set(process_start_directory());
}
else
{
@@ -1508,6 +1535,7 @@ int main(int argc, char** argv)
// Warm up libgcc's backtrace state so the first in-handler backtrace()
// after a fault does not allocate.
backtrace(request_fault_frames, 4);
process_start_directory();
init_base_process();
ensure_proactive_compiler();