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); }