From d3dd84ee70f274bfed83a70473f6ef0201386476 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Tue, 7 Jan 2025 15:35:50 +0100 Subject: [PATCH] fix generating 'extjs' response with exceptions/blessed errors when an api call with the 'extjs' formatter fails, the intention is that the api call succeeds but contains the error in the inner structure ('error'/'status' property). When the api call fails with a raised exception (e.g. PVE::APIClient::Exception), the '$res->{message}' field is an object instead of a string. Currently we directly assign the message to the resulting struct, which we then try to convert to json. Since the message was an object, `to_json` fails with 'encountered object` and the whole api call returns a 501 error (since `handle_api2_request` returns that by default if anything dies there, which is IMHO not correct but a different issue.) By 'stringifying' the message, we avoid the error in `to_json` and the api call can succeed. partially fixes #6051: It improves the error message in PDM when trying to remote migrate and the source cannot correctly resolve the target remote. (We use PVE::APIClient there to query the remote). Signed-off-by: Dominik Csapak --- src/PVE/APIServer/Formatter/Standard.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PVE/APIServer/Formatter/Standard.pm b/src/PVE/APIServer/Formatter/Standard.pm index c4def16..5211473 100644 --- a/src/PVE/APIServer/Formatter/Standard.pm +++ b/src/PVE/APIServer/Formatter/Standard.pm @@ -27,7 +27,7 @@ sub prepare_response_data { # HACK: extjs wants 'success' property instead of useful HTTP status codes if (HTTP::Status::is_error($res->{status})) { $success = 0; - $new->{message} = $res->{message} || status_message($res->{status}); + $new->{message} = "$res->{message}" || status_message($res->{status}); $new->{status} = $res->{status} || 200; $res->{message} = undef; $res->{status} = 200;