Software /
code /
prosody-modules
Comparison
mod_rest/mod_rest.lua @ 4037:991090cb5d18
mod_rest: Add support for CBOR
https://www.zash.se/lua-cbor.html
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 29 May 2020 12:38:23 +0200 |
parent | 4036:04c11b652aeb |
child | 4066:07ae583bc565 |
comparison
equal
deleted
inserted
replaced
4036:04c11b652aeb | 4037:991090cb5d18 |
---|---|
12 local jid = require "util.jid"; | 12 local jid = require "util.jid"; |
13 local json = require "util.json"; | 13 local json = require "util.json"; |
14 local st = require "util.stanza"; | 14 local st = require "util.stanza"; |
15 local um = require "core.usermanager"; | 15 local um = require "core.usermanager"; |
16 local xml = require "util.xml"; | 16 local xml = require "util.xml"; |
17 local have_cbor, cbor = pcall(require, "cbor"); | |
17 | 18 |
18 local jsonmap = module:require"jsonmap"; | 19 local jsonmap = module:require"jsonmap"; |
19 | 20 |
20 local tokens = module:depends("tokenauth"); | 21 local tokens = module:depends("tokenauth"); |
21 | 22 |
66 local parsed, err = json.decode(data); | 67 local parsed, err = json.decode(data); |
67 if not parsed then | 68 if not parsed then |
68 return parsed, err; | 69 return parsed, err; |
69 end | 70 end |
70 return jsonmap.json2st(parsed); | 71 return jsonmap.json2st(parsed); |
72 elseif mimetype == "application/cbor" and have_cbor then | |
73 local parsed, err = cbor.decode(data); | |
74 if not parsed then | |
75 return parsed, err; | |
76 end | |
77 return jsonmap.json2st(parsed); | |
71 elseif mimetype == "application/x-www-form-urlencoded"then | 78 elseif mimetype == "application/x-www-form-urlencoded"then |
72 local parsed = http.formdecode(data); | 79 local parsed = http.formdecode(data); |
73 if type(parsed) == "string" then | 80 if type(parsed) == "string" then |
74 return parse("text/plain", parsed); | 81 return parse("text/plain", parsed); |
75 end | 82 end |
104 local supported_outputs = { | 111 local supported_outputs = { |
105 "application/xmpp+xml", | 112 "application/xmpp+xml", |
106 "application/json", | 113 "application/json", |
107 }; | 114 }; |
108 | 115 |
116 if have_cbor then | |
117 table.insert(supported_inputs, "application/cbor"); | |
118 table.insert(supported_outputs, "application/cbor"); | |
119 end | |
120 | |
109 local function encode(type, s) | 121 local function encode(type, s) |
110 if type == "application/json" then | 122 if type == "application/json" then |
111 return json.encode(jsonmap.st2json(s)); | 123 return json.encode(jsonmap.st2json(s)); |
124 elseif type == "application/cbor" then | |
125 return cbor.encode(jsonmap.st2json(s)); | |
112 elseif type == "text/plain" then | 126 elseif type == "text/plain" then |
113 return s:get_child_text("body") or ""; | 127 return s:get_child_text("body") or ""; |
114 end | 128 end |
115 return tostring(s); | 129 return tostring(s); |
116 end | 130 end |