aboutsummaryrefslogtreecommitdiff
path: root/server/szurubooru/middleware/json_translator.py
diff options
context:
space:
mode:
Diffstat (limited to 'server/szurubooru/middleware/json_translator.py')
-rw-r--r--server/szurubooru/middleware/json_translator.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/server/szurubooru/middleware/json_translator.py b/server/szurubooru/middleware/json_translator.py
new file mode 100644
index 0000000..f04e6c8
--- /dev/null
+++ b/server/szurubooru/middleware/json_translator.py
@@ -0,0 +1,44 @@
+''' Exports JsonTranslator. '''
+
+import json
+from datetime import datetime
+import falcon
+
+def json_serial(obj):
+ ''' JSON serializer for objects not serializable by default JSON code '''
+ if isinstance(obj, datetime):
+ serial = obj.isoformat()
+ return serial
+ raise TypeError('Type not serializable')
+
+class JsonTranslator(object):
+ '''
+ Translates API requests and API responses to JSON using requests'
+ context.
+ '''
+
+ def process_request(self, request, response):
+ ''' Executed before passing the request to the API. '''
+ if request.content_length in (None, 0):
+ return
+
+ body = request.stream.read()
+ if not body:
+ raise falcon.HTTPBadRequest(
+ 'Empty request body',
+ 'A valid JSON document is required.')
+
+ try:
+ request.context.request = json.loads(body.decode('utf-8'))
+ except (ValueError, UnicodeDecodeError):
+ raise falcon.HTTPError(
+ falcon.HTTP_401,
+ 'Malformed JSON',
+ 'Could not decode the request body. The '
+ 'JSON was incorrect or not encoded as UTF-8.')
+
+ def process_response(self, request, response, resource):
+ ''' Executed before passing the response to falcon. '''
+ if 'result' not in request.context:
+ return
+ response.body = json.dumps(request.context.result, default=json_serial)

© 2015 - 2026 Jakob L. Kreuze