From 01563a00550dd001f080aeddd8c6bbc35c676991 Mon Sep 17 00:00:00 2001 From: "Eduardo Lima (Etrunko)" Date: Wed, 11 Jul 2018 15:42:16 -0300 Subject: [PATCH] proxy: Set detailed error message for async call The rest API returns more detailed error messages with the result, not only the literal corresponding to the value. If this is the case, we set a new error message and return it. For example, before this change, virt-viewer showed a dialog with a vague 'Bad Request' message, and now a much more detailed 'Operation Failed: query execution failed due to insufficient permissions.' Signed-off-by: Eduardo Lima (Etrunko) --- govirt/ovirt-proxy.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/govirt/ovirt-proxy.c b/govirt/ovirt-proxy.c index 921e22e..f8e629e 100644 --- a/govirt/ovirt-proxy.c +++ b/govirt/ovirt-proxy.c @@ -240,6 +240,22 @@ call_async_cancelled_cb (G_GNUC_UNUSED GCancellable *cancellable, } +static void rest_call_async_set_error(RestProxyCall *call, GSimpleAsyncResult *result, const GError *error) +{ + GError *local_error = NULL; + RestXmlNode *root = ovirt_rest_xml_node_from_call(call); + + if (root != NULL && ovirt_utils_gerror_from_xml_fault(root, &local_error)) { + g_debug("ovirt_rest_call_async(): %s", local_error->message); + g_simple_async_result_set_from_error(result, local_error); + g_clear_error(&local_error); + } else { + g_simple_async_result_set_from_error(result, error); + } + + rest_xml_node_unref(root); +} + static void call_async_cb(RestProxyCall *call, const GError *error, G_GNUC_UNUSED GObject *weak_object, @@ -249,7 +265,7 @@ call_async_cb(RestProxyCall *call, const GError *error, GSimpleAsyncResult *result = data->result; if (error != NULL) { - g_simple_async_result_set_from_error(result, error); + rest_call_async_set_error(call, result, error); } else { GError *call_error = NULL; gboolean callback_result = TRUE; @@ -259,7 +275,7 @@ call_async_cb(RestProxyCall *call, const GError *error, data->call_user_data, &call_error); if (call_error != NULL) { - g_simple_async_result_set_from_error(result, call_error); + rest_call_async_set_error(call, result, call_error); } } -- 2.20.1