Software /
code /
prosody-modules
Changeset
4552:c87181a98f29
mod_pubsub_post: Add support for urlencoded form-data
This would allow a subset of JSON payloads to be passed easily with
simple `curl -d foo=bar -d hello=there` calls.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 26 Apr 2021 02:49:25 +0200 |
parents | 4551:b92147edd172 |
children | 4553:7e5c8186f121 |
files | mod_pubsub_post/README.markdown mod_pubsub_post/mod_pubsub_post.lua |
diffstat | 2 files changed, 25 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/mod_pubsub_post/README.markdown Mon Apr 26 02:49:06 2021 +0200 +++ b/mod_pubsub_post/README.markdown Mon Apr 26 02:49:25 2021 +0200 @@ -31,7 +31,13 @@ -H "Content-Type: application/xml" \ --data-binary '<feed xmlns="http://www.w3.org/2005/Atom"> <entry><title>Hello</title></entry></feed>' +``` +## Simple form-data + +``` {.bash} +curl http://localhost:5280/pubsub_post/princely_musings \ + --data musing="To be, or not to be: that is the question" ``` # Configuration
--- a/mod_pubsub_post/mod_pubsub_post.lua Mon Apr 26 02:49:06 2021 +0200 +++ b/mod_pubsub_post/mod_pubsub_post.lua Mon Apr 26 02:49:25 2021 +0200 @@ -3,6 +3,7 @@ local st = require "util.stanza"; local json = require "util.json"; local xml = require "util.xml"; +local http = require "net.http"; local uuid_generate = require "util.uuid".generate; local timestamp_generate = require "util.datetime".datetime; local hashes = require "util.hashes"; @@ -102,6 +103,22 @@ end end +local function handle_urlencoded(node, actor, data) + local parsed = http.formdecode(data); + if type(parsed) ~= "table" then return {status_code = 400; body = "invalid payload"}; end + for i = 1, #parsed do parsed[i] = nil; end + + local payload = wrap(node, parsed, json.encode(parsed)); + local item_id = "current"; + if payload.attr["http://jabber.org/protocol/pubsub\1id"] then + item_id = payload.attr["http://jabber.org/protocol/pubsub\1id"]; + payload.attr["http://jabber.org/protocol/pubsub\1id"] = nil; + elseif type(parsed.id) == "string" then + item_id = parsed.id; + end + return publish_payload(node, actor, item_id, payload); +end + local actor_source = module:get_option_string("pubsub_post_actor"); -- COMPAT local default_secret = module:get_option_string("pubsub_post_default_secret"); local actor_secrets = module:get_option("pubsub_post_secrets"); @@ -142,6 +159,8 @@ return handle_xml(path, actor, request.body); elseif content_type == "application/json" or content_type:sub(-5) == "+json" then return handle_json(path, actor, request.body); + elseif content_type == "application/x-www-form-urlencoded" then + return handle_urlencoded(path, actor, request.body); end module:log("debug", "Unsupported content-type: %q", content_type);