mod_json_streams/mod_json_streams.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 24 Sep 2022 08:06:11 +0100
changeset 5060 2583bd7eb5d1
parent 350 98569ec25ac2
permissions -rw-r--r--
mod_cloud_notify: Add warnings about options including real body/sender
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
349
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     1
--
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     2
-- XEP-0295: JSON Encodings for XMPP
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     3
--
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     4
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     5
module.host = "*"
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
350
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
     7
local httpserver = require "net.httpserver";
349
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
local filters = require "util.filters"
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     9
local json = require "util.json"
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    10
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    11
local json_escapes = {
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    12
	["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f",
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    13
	["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t"};
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    14
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    15
local s_char = string.char;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    16
for i=0,31 do
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    17
	local ch = s_char(i);
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    18
	if not json_escapes[ch] then json_escapes[ch] = ("\\u%.4X"):format(i); end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    19
end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    20
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    21
local state_out = 0;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    22
local state_key_before = 1;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    23
local state_key_in = 2;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
local state_key_escape = 3;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    25
local state_key_after = 4;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    26
local state_val_before = 5;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    27
local state_val_in = 6;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    28
local state_val_escape = 7;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    29
local state_val_after = 8;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    30
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    31
local whitespace = { [" "] = true, ["\n"] = true, ["\r"] = true, ["\t"] = true };
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    32
function json_decoder()
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    33
	local state = state_out;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    34
	local quote;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    35
	local output = "";
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    36
	local buffer = "";
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    37
	return function(input)
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    38
		for ch in input:gmatch(".") do
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    39
			module:log("debug", "%s | %d", ch, state)
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    40
			local final = false;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    41
			if state == state_out then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    42
				if whitespace[ch] then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    43
				elseif ch ~= "{" then return nil, "{ expected";
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    44
				else state = state_key_before end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    45
			elseif state == state_key_before then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    46
				if whitespace[ch] then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    47
				elseif ch ~= "'" and ch ~= "\"" then return nil, "\" expected";
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    48
				else quote = ch; state = state_key_in; end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    49
			elseif state == state_key_in then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    50
				if ch == quote then state = state_key_after;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    51
				elseif ch ~= "s" then return nil, "invalid key, 's' expected"; -- only s as key allowed
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    52
				else end -- ignore key
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    53
			elseif state == state_key_after then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    54
				if whitespace[ch] then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    55
				elseif ch ~= ":" then return nil, ": expected";
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    56
				else state = state_val_before; end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    57
			elseif state == state_val_before then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    58
				if whitespace[ch] then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    59
				elseif ch ~= "'" and ch ~= "\"" then return nil, "\" expected";
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    60
				else quote = ch; state = state_val_in; end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    61
			elseif state == state_val_in then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    62
				if ch == quote then state = state_val_after;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    63
				elseif ch == "\\" then state = state_val_escape;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    64
				else end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    65
			elseif state == state_val_after then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    66
				if whitespace[ch] then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
				elseif ch ~= "}" then return nil, "} expected";
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
				else state = state_out;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    69
					final = true;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    70
				end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    71
			elseif state == state_val_escape then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    72
				state = state_val_in;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    73
			else
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    74
				module:log("error", "Unhandled state: "..state);
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
				return nil, "Unhandled state in parser"
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
			end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    77
			buffer = buffer..ch;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    78
			if final then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    79
				module:log("debug", "%s", buffer)
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    80
				local tmp;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    81
				pcall(function() tmp = json.decode(buffer); end);
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    82
				if not tmp then return nil, "Invalid JSON"; end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    83
				output, buffer = output..tmp.s, "";
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    84
			end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    85
		end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    86
		local _ = output; output = "";
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    87
		return _;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    88
	end;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    89
end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    90
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    91
function filter_hook(session)
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    92
	local determined = false;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    93
	local is_json = false;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    94
	local function in_filter(t)
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    95
		if not determined then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    96
			is_json = (t:sub(1,1) == "{") and json_decoder();
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    97
			determined = true;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    98
		end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    99
		if is_json then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   100
			local s, err = is_json(t);
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   101
			if not err then return s; end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   102
			session:close("not-well-formed");
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   103
			return;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   104
		end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   105
		return t;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   106
	end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   107
	local function out_filter(t)
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   108
		if is_json then
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   109
			return '{"s":"' .. t:gsub(".", json_escapes) .. '"}'; -- encode
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   110
		end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   111
		return t;
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   112
	end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   113
	filters.add_filter(session, "bytes/in", in_filter,   100);
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   114
	filters.add_filter(session, "bytes/out", out_filter, 100);
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   115
end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   116
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   117
function module.load()
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   118
	filters.add_filter_hook(filter_hook);
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   119
end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   120
function module.unload()
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   121
	filters.remove_filter_hook(filter_hook);
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   122
end
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   123
350
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   124
function encode(data)
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   125
	if type(data) == "string" then
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   126
		data = json.encode({ s = data });
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   127
	elseif type(data) == "table" and data.body then
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   128
		data.body = json.encode({ s = data.body });
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   129
		data.headers["Content-Type"] = "application/json";
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   130
	end
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   131
	return data;
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   132
end
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   133
function handle_request(method, body, request)
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   134
	local mod_bosh = modulemanager.get_module("*", "bosh")
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   135
	if mod_bosh then
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   136
		if body and method == "POST" then
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   137
			pcall(function() body = json.decode(body).s; end);
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   138
		end
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   139
		local _send = request.send;
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   140
		function request:send(data) return _send(self, encode(data)); end
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   141
		return encode(mod_bosh.handle_request(method, body, request));
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   142
	end
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   143
	return "<html><body>mod_bosh not loaded</body></html>";
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   144
end
349
ee99eafdd168 mod_json_streams: An implementation of XEP-0295: JSON Encodings for XMPP.
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   145
350
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   146
local function setup()
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   147
	local ports = module:get_option("jsonstreams_ports") or { 5280 };
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   148
	httpserver.new_from_config(ports, handle_request, { base = "jsonstreams" });
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   149
end
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   150
if prosody.start_time then -- already started
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   151
	setup();
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   152
else
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   153
	prosody.events.add_handler("server-started", setup);
98569ec25ac2 mod_json_streams: Add BOSH support (on HTTP path "/jsonstreams").
Waqas Hussain <waqas20@gmail.com>
parents: 349
diff changeset
   154
end