diff --git a/warden_server/warden_server.py b/warden_server/warden_server.py index e64431781dbefe9ae7e024dfb51943aaf976b7f2..e52e06b2e25635103b1d2a49cf2c0a52acfdf4df 100755 --- a/warden_server/warden_server.py +++ b/warden_server/warden_server.py @@ -47,6 +47,12 @@ from jsonschema import Draft4Validator VERSION = "3.0-beta3" +class Encoder(json.JSONEncoder): + def default(self, o): + if isinstance(o, Error): + return o.to_dict() + return str(o) + class Error(Exception): def __init__(self, method=None, req_id=None, errors=None, **kwargs): @@ -108,7 +114,7 @@ class Error(Exception): ecopy.pop("message", None) ecopy.pop("exc", None) if ecopy: - out = "Detail: %s" % (json.dumps(ecopy, default=lambda v: str(v))) + out = "Detail: %s" % (json.dumps(ecopy, cls=Encoder)) else: out = "" return out @@ -1527,7 +1533,7 @@ class Server(ObjectBase): if exception: status = "%d %s" % exception.get_http_err_msg() - output = json.dumps(exception.to_dict(), default=lambda v: str(v)) + output = json.dumps(exception, cls=Encoder) exception.log(self.log) # Make sure everything is properly encoded - JSON and various function @@ -1567,9 +1573,7 @@ def json_wrapper(method): result = method(self, **args) # call requested method try: - # 'default': takes care of non JSON serializable objects, - # which could (although shouldn't) appear in handler code - output = json.dumps(result, default=lambda v: str(v)) + output = json.dumps(result, cls=Encoder) except Exception as e: raise self.req.error(message="Serialization error", error=500, exc=sys.exc_info(), args=str(result))