22
33# Flask JSON encoder so we get UUID, datetime etc support
44from flask .json import JSONEncoder
5- from json import dumps
5+ from base64 import b64encode
6+ import json
7+ import cbor2
68
79
810from ..core .utilities import PY3
@@ -16,17 +18,14 @@ class LabThingsJSONEncoder(JSONEncoder):
1618 def default (self , o ):
1719 if isinstance (o , set ):
1820 return list (o )
21+ if isinstance (o , bytes ):
22+ return b64encode (o ).decode ()
1923 return JSONEncoder .default (self , o )
2024
2125
2226def encode_json (data , encoder = LabThingsJSONEncoder , ** settings ):
2327 """Makes JSON encoded data using the LabThings JSON encoder"""
24-
25- # always end the json dumps with a new line
26- # see https://github.com/mitsuhiko/flask/pull/1262
27- dumped = dumps (data , cls = encoder , ** settings ) + "\n "
28-
29- return dumped
28+ return json .dumps (data , cls = encoder , ** settings ) + "\n "
3029
3130
3231def output_json (data , code , headers = None ):
@@ -35,9 +34,6 @@ def output_json(data, code, headers=None):
3534 settings = current_app .config .get ("LABTHINGS_JSON" , {})
3635 encoder = current_app .json_encoder
3736
38- # If we're in debug mode, and the indent is not set, we set it to a
39- # reasonable value here. Note that this won't override any existing value
40- # that was set. We also set the "sort_keys" value.
4137 if current_app .debug :
4238 settings .setdefault ("indent" , 4 )
4339 settings .setdefault ("sort_keys" , not PY3 )
@@ -46,7 +42,29 @@ def output_json(data, code, headers=None):
4642
4743 resp = make_response (dumped , code )
4844 resp .headers .extend (headers or {})
45+ resp .mimetype = "application/json"
46+ return resp
47+
48+
49+ def encode_cbor (data , ** settings ):
50+ """Makes CBOR encoded data using the default CBOR encoder"""
51+ return cbor2 .dumps (data , ** settings )
52+
53+
54+ def output_cbor (data , code , headers = None ):
55+ """Makes a Flask response with a CBOR encoded body, using app CBOR settings"""
56+
57+ settings = current_app .config .get ("LABTHINGS_CBOR" , {})
58+
59+ dumped = encode_cbor (data , ** settings )
60+
61+ resp = make_response (dumped , code )
62+ resp .headers .extend (headers or {})
63+ resp .mimetype = "application/cbor"
4964 return resp
5065
5166
52- DEFAULT_REPRESENTATIONS = [("application/json" , output_json )]
67+ DEFAULT_REPRESENTATIONS = [
68+ ("application/json" , output_json ),
69+ ("application/cbor" , output_cbor ),
70+ ]
0 commit comments