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