From dfb88418f10f1f81ff99710861f34e723a28d61c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 22 Nov 2020 02:18:22 +0100 Subject: [PATCH] Support more complex errors (be able to return additional data in a json structure) --- moulinette/core.py | 3 +++ moulinette/interfaces/api.py | 14 +++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/moulinette/core.py b/moulinette/core.py index 17041253..fa7e3992 100644 --- a/moulinette/core.py +++ b/moulinette/core.py @@ -388,6 +388,9 @@ class MoulinetteError(Exception): super(MoulinetteError, self).__init__(msg) self.strerror = msg + def content(self): + return self.strerror + class MoulinetteLdapIsDownError(MoulinetteError): """Used when ldap is down""" diff --git a/moulinette/interfaces/api.py b/moulinette/interfaces/api.py index 7f679c7d..110150aa 100644 --- a/moulinette/interfaces/api.py +++ b/moulinette/interfaces/api.py @@ -481,7 +481,7 @@ class _ActionsMapPlugin(object): try: ret = self.actionsmap.process(arguments, timeout=30, route=_route) except MoulinetteError as e: - raise HTTPBadRequestResponse(e.strerror) + raise HTTPBadRequestResponse(e) except Exception as e: if isinstance(e, HTTPResponse): raise e @@ -550,8 +550,16 @@ class HTTPOKResponse(HTTPResponse): class HTTPBadRequestResponse(HTTPResponse): - def __init__(self, output=""): - super(HTTPBadRequestResponse, self).__init__(output, 400) + def __init__(self, error=""): + + if isinstance(error, MoulinetteError): + content = error.content() + if isinstance(content, dict): + super(HTTPBadRequestResponse, self).__init__(json_encode(content), 400, headers={'Content-type': 'application/json'}) + else: + super(HTTPBadRequestResponse, self).__init__(content, 400) + else: + super(HTTPBadRequestResponse, self).__init__(error, 400) class HTTPUnauthorizedResponse(HTTPResponse):