Mercurial > prosody-modules
comparison mod_rest/mod_rest.lua @ 6178: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 |
| parents | a0d77b427d50 |
| children | c71d8bc77c95 |
comparison
equal
deleted
inserted
replaced
| 6177:8ff8121ff603 | 6178: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); |
