Mercurial > prosody-modules
comparison mod_pubsub_post/mod_pubsub_post.lua @ 3016:3f4e2340bfdc
mod_pubsub_post: Add support for publishing arbitrary JSON
Payloads are wrapped in XEP-0335: JSON Containers
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 20 May 2018 00:00:33 +0200 |
parents | 338b7c808ecc |
children | 8e48c0b233e0 |
comparison
equal
deleted
inserted
replaced
3015:338b7c808ecc | 3016:3f4e2340bfdc |
---|---|
22 module:log("debug", ":publish(%q, true, %q, %s) -> %q", node, item_id, payload:top_tag(), err or ""); | 22 module:log("debug", ":publish(%q, true, %q, %s) -> %q", node, item_id, payload:top_tag(), err or ""); |
23 if not ok then | 23 if not ok then |
24 return error_mapping[err] or 500; | 24 return error_mapping[err] or 500; |
25 end | 25 end |
26 return 202; | 26 return 202; |
27 end | |
28 | |
29 local function handle_json(node, data) | |
30 local parsed, err = json.decode(data); | |
31 if not parsed then | |
32 return { status_code = 400; body = tostring(err); } | |
33 end | |
34 if type(parsed) ~= "table" then | |
35 return { status_code = 400; body = "object or array expected"; }; | |
36 end | |
37 local wrapper = st.stanza("json", { xmlns="urn:xmpp:json:0" }):text(data); | |
38 return publish_payload(node, data.id or "current", wrapper); | |
27 end | 39 end |
28 | 40 |
29 local function publish_atom(node, feed) | 41 local function publish_atom(node, feed) |
30 for entry in feed:childtags("entry") do | 42 for entry in feed:childtags("entry") do |
31 local item_id = entry:get_child_text("id"); | 43 local item_id = entry:get_child_text("id"); |
61 | 73 |
62 local content_type = request.headers.content_type or "application/octet-stream"; | 74 local content_type = request.headers.content_type or "application/octet-stream"; |
63 | 75 |
64 if content_type == "application/xml" or content_type:sub(-4) == "+xml" then | 76 if content_type == "application/xml" or content_type:sub(-4) == "+xml" then |
65 return handle_xml(path, request.body); | 77 return handle_xml(path, request.body); |
78 elseif content_type == "application/json" or content_type:sub(-5) == "+json" then | |
79 return handle_json(path, request.body); | |
66 end | 80 end |
67 | 81 |
68 module:log("debug", "Unsupported content-type: %q", content_type); | 82 module:log("debug", "Unsupported content-type: %q", content_type); |
69 return 415; | 83 return 415; |
70 end | 84 end |