Signed-off-by: Jakub Filak <jfilak(a)redhat.com>
---
src/plugins/ureport.c | 99 ++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 82 insertions(+), 17 deletions(-)
diff --git a/src/plugins/ureport.c b/src/plugins/ureport.c
index ed01cc7..f517a51 100644
--- a/src/plugins/ureport.c
+++ b/src/plugins/ureport.c
@@ -17,9 +17,52 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#include <json/json.h>
#include "internal_libreport.h"
#include "abrt_curl.h"
+enum response_type
+{
+ UREPORT_SERVER_RESP_UNKNOWN_TYPE,
+ UREPORT_SERVER_RESP_KNOWN,
+ UREPORT_SERVER_RESP_ERROR,
+};
+
+struct ureport_server_response {
+ enum response_type type;
+ const char *value;
+};
+
+/*
+ * Reponse samples:
+ * {"error":"field 'foo' is required"}
+ * {"response":"true"}
+ * {"response":"false"}
+ */
+static bool ureport_server_parse_json(json_object *json, struct ureport_server_response
*out_response)
+{
+ json_object *obj = json_object_object_get(json, "error");
+
+ if (obj)
+ {
+ out_response->type = UREPORT_SERVER_RESP_ERROR;
+ out_response->value = json_object_to_json_string(obj);
+ return true;
+ }
+
+ obj = json_object_object_get(json, "response");
+
+ if (obj)
+ {
+ out_response->type = UREPORT_SERVER_RESP_KNOWN;
+ out_response->value = json_object_to_json_string(obj);
+ return true;
+ }
+
+ out_response->type = UREPORT_SERVER_RESP_UNKNOWN_TYPE;
+ return false;
+}
+
int main(int argc, char **argv)
{
abrt_init(argv);
@@ -63,30 +106,52 @@ int main(int argc, char **argv)
}
}
- // TODO : parse JSON response
- char *line = strtok(post_state->body, "\n");
- VERB2 log("Response:\n----\n%s\n----", line);
+ int ret = 1; /* return 1 by default */
+ json_object *const json = json_tokener_parse(post_state->body);
- int ret = 0;
- while (line)
+ if (is_error(json))
{
- if (!prefixcmp(line, "ERROR "))
- {
- log("%s", line);
- ret = 1;
- break;
- }
+ error_msg("fatal: unable to parse response from ureport server");
+ goto FINISH;
+ }
- if (!prefixcmp(line, "NEEDMORE"))
- {
- log("%s", line);
+ struct ureport_server_response response = {
+ .type=UREPORT_SERVER_RESP_UNKNOWN_TYPE,
+ .value=NULL,
+ };
+
+ const bool is_valid_response = ureport_server_parse_json(json, &response);
+
+ if (!is_valid_response)
+ {
+ error_msg("fatal: wrong format of response from ureport server");
+ goto FINISH;
+ }
+
+ switch (response.type)
+ {
+ case UREPORT_SERVER_RESP_KNOWN:
+ VERB1 log("is known: %s", response.value);
ret = 0;
+ /* If a reported problem is not known then emit NEEDMORE */
+ if (strcmp("true",response.value))
+ log("NEEDMORE");
+ break;
+ case UREPORT_SERVER_RESP_ERROR:
+ ret = 1; /* just to be sure */
+ break;
+ case UREPORT_SERVER_RESP_UNKNOWN_TYPE:
+ error_msg("invalid server response: %s", response.value);
+ ret = 1; /* just to be sure */
+ break;
+ default:
+ error_msg("reporter internal error: missing handler for response
type");
+ ret = 1; /* just to be sure */
break;
- }
-
- line = strtok(NULL, "\n");
}
+FINISH:
+ json_object_put(json);
free_abrt_post_state(post_state);
return ret;
--
1.7.7.6
Show replies by date