Files
szurubooru/server/szurubooru/middleware/json_translator.py
2016-04-08 22:06:15 +02:00

57 lines
1.9 KiB
Python

import cgi
import datetime
import json
import falcon
def json_serial(obj):
''' JSON serializer for objects not serializable by default JSON code '''
if isinstance(obj, datetime.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):
if request.content_length in (None, 0):
return
request.context.files = {}
if 'multipart/form-data' in (request.content_type or ''):
# obscure, claims to "avoid a bug in cgi.FieldStorage"
request.env.setdefault('QUERY_STRING', '')
form = cgi.FieldStorage(fp=request.stream, environ=request.env)
for key in form:
if key != 'metadata':
request.context.files[key] = (
form.getvalue(key),
getattr(form[key], 'filename', None))
body = form.getvalue('metadata')
else:
body = request.stream.read().decode('utf-8')
if not body:
raise falcon.HTTPBadRequest(
'Empty request body',
'A valid JSON document is required.')
try:
request.context.request = json.loads(body)
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):
if 'result' not in request.context:
return
response.body = json.dumps(
request.context.result, default=json_serial, indent=2)