Comparison

mod_rest/mod_rest.lua @ 6206:ac7e2992fe6e

mod_rest: Strip down error payloads to avoid stack overflow When the util.error feature of including a traceback in the error, util.json can't serialize it as it is often self-referential.
author Kim Alvefur <zash@zash.se>
date Sun, 16 Mar 2025 17:04:51 +0100
parent 5993:a0d77b427d50
child 6244:c71d8bc77c95
comparison
equal deleted inserted replaced
6205:8ff8121ff603 6206:ac7e2992fe6e
660 "text/html", 660 "text/html",
661 "application/xmpp+xml", 661 "application/xmpp+xml",
662 "application/json", 662 "application/json",
663 }; 663 };
664 664
665 -- strip some stuff, notably the optional traceback table that casues stack overflow in util.json
666 local function simplify_error(e)
667 return {
668 type = e.type;
669 condition = e.condition;
670 text = e.text;
671 extra = e.extra;
672 source = e.source;
673 };
674 end
675
665 local http_server = require "net.http.server"; 676 local http_server = require "net.http.server";
666 module:hook_object_event(http_server, "http-error", function (event) 677 module:hook_object_event(http_server, "http-error", function (event)
667 local request, response = event.request, event.response; 678 local request, response = event.request, event.response;
668 local response_as = decide_type(request and request.headers.accept or "", supported_errors); 679 local response_as = decide_type(request and request.headers.accept or "", supported_errors);
669 if response_as == "application/xmpp+xml" then 680 if response_as == "application/xmpp+xml" then
682 if response then 693 if response then
683 response.headers.content_type = "application/json"; 694 response.headers.content_type = "application/json";
684 end 695 end
685 return json.encode({ 696 return json.encode({
686 type = "error", 697 type = "error",
687 error = event.error, 698 error = simplify_error(event.error),
688 code = event.code, 699 code = event.code,
689 }); 700 });
690 end 701 end
691 end, 1); 702 end, 1);