From e18f658d80beeea199b03b989672ab132308f59e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jakub=20Malo=C5=A1t=C3=ADk?= <jakub@alderamin.localdomain>
Date: Mon, 6 Mar 2023 19:29:50 +0200
Subject: [PATCH] Create a JSON Encoder class

---
 warden_server/warden_server.py | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/warden_server/warden_server.py b/warden_server/warden_server.py
index e644317..e52e06b 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))
 
-- 
GitLab