From 53d7c5798290d8c5adedffe79c2ad6b7ea35d86a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Fri, 9 Jun 2017 13:26:22 +0300 Subject: [PATCH] MXS-1220: Add error descriptions to REST API module commands The module command calls that fail can now display additional information in the form of an error object. --- include/maxscale/modulecmd.h | 6 ++++++ server/core/modulecmd.cc | 29 +++++++++++++++++++++++++++++ server/core/resource.cc | 7 ++++++- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/include/maxscale/modulecmd.h b/include/maxscale/modulecmd.h index cb9a918d9..bcbb3d5ff 100644 --- a/include/maxscale/modulecmd.h +++ b/include/maxscale/modulecmd.h @@ -265,6 +265,12 @@ void modulecmd_set_error(const char *format, ...); */ const char* modulecmd_get_error(); +/** + * @brief Get JSON formatted error + * + * @return The error or NULL if no errors have occurred + */ +json_t* modulecmd_get_json_error(); /** * @brief Call a function for each command diff --git a/server/core/modulecmd.cc b/server/core/modulecmd.cc index 16791f965..57c5463a9 100644 --- a/server/core/modulecmd.cc +++ b/server/core/modulecmd.cc @@ -13,6 +13,8 @@ #include +#include + #include #include #include @@ -575,12 +577,39 @@ void modulecmd_set_error(const char *format, ...) va_end(list); } +static void modulecmd_clear_error() +{ + prepare_error(); + errbuf[0] = '\0'; +} + const char* modulecmd_get_error() { prepare_error(); return errbuf; } +json_t* modulecmd_get_json_error() +{ + json_t* obj = NULL; + std::string errmsg = modulecmd_get_error(); + modulecmd_clear_error(); + + if (errmsg.length()) + { + json_t* err = json_object(); + json_object_set_new(err, "detail", json_string(errmsg.c_str())); + + json_t* arr = json_array(); + json_array_append_new(arr, err); + + obj = json_object(); + json_object_set_new(obj, "errors", arr); + } + + return obj; +} + bool modulecmd_foreach(const char *domain_re, const char *ident_re, bool(*fn)(const MODULECMD *cmd, void *data), void *data) { diff --git a/server/core/resource.cc b/server/core/resource.cc index 7fbe93b37..db37a2e42 100644 --- a/server/core/resource.cc +++ b/server/core/resource.cc @@ -593,7 +593,7 @@ HttpResponse cb_modulecmd(const HttpRequest& request) MXS_FREE(opts[i]); } - int rc = MHD_HTTP_INTERNAL_SERVER_ERROR; + int rc; if (rval) { @@ -613,6 +613,11 @@ HttpResponse cb_modulecmd(const HttpRequest& request) rc = MHD_HTTP_NO_CONTENT; } } + else + { + rc = MHD_HTTP_FORBIDDEN; + output = modulecmd_get_json_error(); + } return HttpResponse(rc, output); }