Matej Habrnal ef5d23
From 878d29d13773d035fc6a41d6b2c402f021e10dbd Mon Sep 17 00:00:00 2001
Matej Habrnal ef5d23
From: Matej Habrnal <mhabrnal@redhat.com>
Matej Habrnal ef5d23
Date: Wed, 26 Aug 2015 13:41:27 +0200
Matej Habrnal ef5d23
Subject: [PATCH] bodhi: add parsing of error responses
Matej Habrnal ef5d23
Matej Habrnal ef5d23
Resolves: rhbz#1256493
Matej Habrnal ef5d23
Matej Habrnal ef5d23
Signed-off-by: Matej Habrnal <mhabrnal@redhat.com>
Matej Habrnal ef5d23
---
Matej Habrnal ef5d23
 src/plugins/bodhi.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
Matej Habrnal ef5d23
 1 file changed, 69 insertions(+), 1 deletion(-)
Matej Habrnal ef5d23
Matej Habrnal ef5d23
diff --git a/src/plugins/bodhi.c b/src/plugins/bodhi.c
Matej Habrnal ef5d23
index 9149347..b348a26 100644
Matej Habrnal ef5d23
--- a/src/plugins/bodhi.c
Matej Habrnal ef5d23
+++ b/src/plugins/bodhi.c
Matej Habrnal ef5d23
@@ -217,6 +217,58 @@ static void print_bodhi(struct bodhi *b)
Matej Habrnal ef5d23
 }
Matej Habrnal ef5d23
 #endif
Matej Habrnal ef5d23
 
Matej Habrnal ef5d23
+/* bodhi returns following json structure in case of error
Matej Habrnal ef5d23
+{
Matej Habrnal ef5d23
+   "status": "error",
Matej Habrnal ef5d23
+   "errors":
Matej Habrnal ef5d23
+              [
Matej Habrnal ef5d23
+                {
Matej Habrnal ef5d23
+                   "location": "querystring",
Matej Habrnal ef5d23
+                   "name": "releases",
Matej Habrnal ef5d23
+                   "description": "Invalid releases specified: Rawhide"
Matej Habrnal ef5d23
+                }
Matej Habrnal ef5d23
+              ]
Matej Habrnal ef5d23
+}
Matej Habrnal ef5d23
+*/
Matej Habrnal ef5d23
+static void bodhi_print_errors_from_json(json_object *json)
Matej Habrnal ef5d23
+{
Matej Habrnal ef5d23
+
Matej Habrnal ef5d23
+    json_object *errors_array = NULL;
Matej Habrnal ef5d23
+    bodhi_read_value(json, "errors", &errors_array, BODHI_READ_JSON_OBJ);
Matej Habrnal ef5d23
+    if (!errors_array)
Matej Habrnal ef5d23
+    {
Matej Habrnal ef5d23
+        error_msg("Error: unable to read 'errors' array from json");
Matej Habrnal ef5d23
+        return;
Matej Habrnal ef5d23
+    }
Matej Habrnal ef5d23
+
Matej Habrnal ef5d23
+    int errors_len = json_object_array_length(errors_array);
Matej Habrnal ef5d23
+    for (int i = 0; i < errors_len; ++i)
Matej Habrnal ef5d23
+    {
Matej Habrnal ef5d23
+        json_object *error = json_object_array_get_idx(errors_array, i);
Matej Habrnal ef5d23
+        if (!error)
Matej Habrnal ef5d23
+        {
Matej Habrnal ef5d23
+            error_msg("Error: unable to get 'error[%d]'", i);
Matej Habrnal ef5d23
+            json_object_put(errors_array);
Matej Habrnal ef5d23
+            return;
Matej Habrnal ef5d23
+        }
Matej Habrnal ef5d23
+
Matej Habrnal ef5d23
+        char *desc_item = NULL;
Matej Habrnal ef5d23
+        bodhi_read_value(error, "description", &desc_item, BODHI_READ_STR);
Matej Habrnal ef5d23
+        if (!desc_item)
Matej Habrnal ef5d23
+        {
Matej Habrnal ef5d23
+            error_msg("Error: unable to get 'description' from 'error[%d]'", i);
Matej Habrnal ef5d23
+            continue;
Matej Habrnal ef5d23
+        }
Matej Habrnal ef5d23
+
Matej Habrnal ef5d23
+        error_msg("Error: %s", desc_item);
Matej Habrnal ef5d23
+        json_object_put(error);
Matej Habrnal ef5d23
+        free(desc_item);
Matej Habrnal ef5d23
+    }
Matej Habrnal ef5d23
+
Matej Habrnal ef5d23
+    json_object_put(errors_array);
Matej Habrnal ef5d23
+    return;
Matej Habrnal ef5d23
+}
Matej Habrnal ef5d23
+
Matej Habrnal ef5d23
 static GHashTable *bodhi_parse_json(json_object *json, const char *release)
Matej Habrnal ef5d23
 {
Matej Habrnal ef5d23
 
Matej Habrnal ef5d23
@@ -326,7 +378,7 @@ static GHashTable *bodhi_query_list(const char *query, const char *release)
Matej Habrnal ef5d23
     get(post_state, bodhi_url_bugs, "application/x-www-form-urlencoded",
Matej Habrnal ef5d23
                      headers);
Matej Habrnal ef5d23
 
Matej Habrnal ef5d23
-    if (post_state->http_resp_code != 200)
Matej Habrnal ef5d23
+    if (post_state->http_resp_code != 200 && post_state->http_resp_code != 400)
Matej Habrnal ef5d23
     {
Matej Habrnal ef5d23
         char *errmsg = post_state->curl_error_msg;
Matej Habrnal ef5d23
         if (errmsg && errmsg[0])
Matej Habrnal ef5d23
@@ -340,6 +392,22 @@ static GHashTable *bodhi_query_list(const char *query, const char *release)
Matej Habrnal ef5d23
     if (is_error(json))
Matej Habrnal ef5d23
         error_msg_and_die("fatal: unable parse response from bodhi server");
Matej Habrnal ef5d23
 
Matej Habrnal ef5d23
+    /* we must check the http_resp_code because only error responses contain
Matej Habrnal ef5d23
+     * 'status' item. 'bodhi_read_value' function prints an error message in
Matej Habrnal ef5d23
+     * the case it did not found the item */
Matej Habrnal ef5d23
+    if (post_state->http_resp_code != 200)
Matej Habrnal ef5d23
+    {
Matej Habrnal ef5d23
+        char *status_item = NULL;
Matej Habrnal ef5d23
+        bodhi_read_value(json, "status", &status_item, BODHI_READ_STR);
Matej Habrnal ef5d23
+        if (status_item != NULL && strcmp(status_item, "error") == 0)
Matej Habrnal ef5d23
+        {
Matej Habrnal ef5d23
+            free(status_item);
Matej Habrnal ef5d23
+            bodhi_print_errors_from_json(json);
Matej Habrnal ef5d23
+            json_object_put(json);
Matej Habrnal ef5d23
+            xfunc_die(); // error_msg are printed in bodhi_print_errors_from_json
Matej Habrnal ef5d23
+        }
Matej Habrnal ef5d23
+    }
Matej Habrnal ef5d23
+
Matej Habrnal ef5d23
     GHashTable *bodhi_table = bodhi_parse_json(json, release);
Matej Habrnal ef5d23
     json_object_put(json);
Matej Habrnal ef5d23
     free_post_state(post_state);
Matej Habrnal ef5d23
-- 
Matej Habrnal ef5d23
2.5.0
Matej Habrnal ef5d23