Annotate

plugins/mod_bosh.lua @ 10446:5c2d1b13537c

util.stanza: Support the 'by' attribute on errors This is to be used when the entity generating the error is not the same as the one the stanza was directed to, e.g. an intermediate server.
author Kim Alvefur <zash@zash.se>
date Mon, 25 Nov 2019 20:59:36 +0100
parent 10377:4c36bc28b99e
child 10728:2764beb552cd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1112
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2099
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2099
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5634
7298c9bbb30f mod_bosh: Some very minor whitespace/layout fixes
Matthew Wild <mwild1@gmail.com>
parents: 5188
diff changeset
4 --
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1112
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1112
diff changeset
6 -- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1112
diff changeset
7 --
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1112
diff changeset
8
9377
f2013233e20d mod_bosh: Make BOSH global again!
Kim Alvefur <zash@zash.se>
parents: 8918
diff changeset
9 module:set_global();
f2013233e20d mod_bosh: Make BOSH global again!
Kim Alvefur <zash@zash.se>
parents: 8918
diff changeset
10
3707
79f62694d36e mod_bosh: Switch to util.xmppstream from xmlhandlers
Matthew Wild <mwild1@gmail.com>
parents: 3684
diff changeset
11 local new_xmpp_stream = require "util.xmppstream".new;
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local sm = require "core.sessionmanager";
679
9506bf204b1a Numerous BOSH improvements... handle client disconnects, either explicit or implicit through inactivity; allow specifying BOSH default parameters through config; fix to prevent prematurely closing request connections in some cases, before they were replied to
Matthew Wild <mwild1@gmail.com>
parents: 660
diff changeset
13 local sm_destroy_session = sm.destroy_session;
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 local new_uuid = require "util.uuid".generate;
5013
ab693eea0869 mod_admin_adhoc, mod_admin_telnet, mod_bosh, mod_c2s, mod_component, mod_pep, mod_presence, mod_roster, mod_s2s: Import core_post_stanza from the global prosody table.
Kim Alvefur <zash@zash.se>
parents: 4998
diff changeset
15 local core_process_stanza = prosody.core_process_stanza;
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local st = require "util.stanza";
1109
bb21eb3cd364 mod_bosh: Give BOSH sessions a logger (thanks Florob)
Matthew Wild <mwild1@gmail.com>
parents: 1049
diff changeset
17 local logger = require "util.logger";
8492
2dd07828ede1 mod_bosh: Use moduleapi logger
Kim Alvefur <zash@zash.se>
parents: 8491
diff changeset
18 local log = module._log;
5187
d71f731e8fe4 mod_bosh: Add support for stanza filters to BOSH sessions (needed by some plugins)
Matthew Wild <mwild1@gmail.com>
parents: 5185
diff changeset
19 local initialize_filters = require "util.filters".initialize;
5185
ca30b21946ef mod_bosh: Add bosh_max_wait config option, to limit the amount of time a client can request for the server to hold open requests
Matthew Wild <mwild1@gmail.com>
parents: 5179
diff changeset
20 local math_min = math.min;
7390
3219b23c4255 mod_bosh: Remove unused imports (also mistake in merge)
Kim Alvefur <zash@zash.se>
parents: 7389
diff changeset
21 local tostring, type = tostring, type;
5727
372ecf3630cf mod_bosh: pcall() core_process_stanza per stanza, to bring in line with other listeners. This ensures that stanzas following a traceback-causing stanza in a request will still be processed (as would happen on normal c2s).
Matthew Wild <mwild1@gmail.com>
parents: 5726
diff changeset
22 local traceback = debug.traceback;
7389
bbed548b4306 mod_bosh: Fix imports that got lost in merge
Kim Alvefur <zash@zash.se>
parents: 7388
diff changeset
23 local runner = require"util.async".runner;
7378
d15cfe8627ad mod_bosh: Validate 'to' host (see #343)
Kim Alvefur <zash@zash.se>
parents: 7377
diff changeset
24 local nameprep = require "util.encodings".stringprep.nameprep;
8747
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
25 local cache = require "util.cache";
1665
2c72b725384e mod_bosh: Strip BOSH namespace from stanzas to allow for some clients which may send them without the correct xmlns
Matthew Wild <mwild1@gmail.com>
parents: 1664
diff changeset
26
3448
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
27 local xmlns_streams = "http://etherx.jabber.org/streams";
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
28 local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams";
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 local xmlns_bosh = "http://jabber.org/protocol/httpbind"; -- (hard-coded into a literal in session.send)
3449
0a74ce129a06 mod_bosh: Small change to use variable instead of hard-coded xmlns
Matthew Wild <mwild1@gmail.com>
parents: 3448
diff changeset
30
0a74ce129a06 mod_bosh: Small change to use variable instead of hard-coded xmlns
Matthew Wild <mwild1@gmail.com>
parents: 3448
diff changeset
31 local stream_callbacks = {
0a74ce129a06 mod_bosh: Small change to use variable instead of hard-coded xmlns
Matthew Wild <mwild1@gmail.com>
parents: 3448
diff changeset
32 stream_ns = xmlns_bosh, stream_tag = "body", default_ns = "jabber:client" };
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33
7653
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
34 -- These constants are implicitly assumed within the code, and cannot be changed
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
35 local BOSH_HOLD = 1;
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
36 local BOSH_MAX_REQUESTS = 2;
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
37
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
38 -- The number of seconds a BOSH session should remain open with no requests
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
39 local bosh_max_inactivity = module:get_option_number("bosh_max_inactivity", 60);
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
40 -- The minimum amount of time between requests with no payload
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
41 local bosh_max_polling = module:get_option_number("bosh_max_polling", 5);
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
42 -- The maximum amount of time that the server will hold onto a request before replying
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
43 -- (the client can set this to a lower value when it connects, if it chooses)
5185
ca30b21946ef mod_bosh: Add bosh_max_wait config option, to limit the amount of time a client can request for the server to hold open requests
Matthew Wild <mwild1@gmail.com>
parents: 5179
diff changeset
44 local bosh_max_wait = module:get_option_number("bosh_max_wait", 120);
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45
3070
3238b58fd118 mod_bosh: Add option consider_bosh_secure to treat BOSH sessions as encrypted even if they don't use HTTP (useful for when secure requests are proxied to Prosody over HTTP)
Matthew Wild <mwild1@gmail.com>
parents: 3043
diff changeset
46 local consider_bosh_secure = module:get_option_boolean("consider_bosh_secure");
9794
4b5c24f13d4a mod_bosh: Drop CORS code in favor of than in mod_http
Kim Alvefur <zash@zash.se>
parents: 9777
diff changeset
47 local cross_domain = module:get_option("cross_domain_bosh");
2484
cf924f587410 mod_bosh: Support for cross-domain access control using CORS
Matthew Wild <mwild1@gmail.com>
parents: 2473
diff changeset
48
9794
4b5c24f13d4a mod_bosh: Drop CORS code in favor of than in mod_http
Kim Alvefur <zash@zash.se>
parents: 9777
diff changeset
49 if cross_domain ~= nil then
4b5c24f13d4a mod_bosh: Drop CORS code in favor of than in mod_http
Kim Alvefur <zash@zash.se>
parents: 9777
diff changeset
50 module:log("info", "The 'cross_domain_bosh' option has been deprecated");
4b5c24f13d4a mod_bosh: Drop CORS code in favor of than in mod_http
Kim Alvefur <zash@zash.se>
parents: 9777
diff changeset
51 end
2484
cf924f587410 mod_bosh: Support for cross-domain access control using CORS
Matthew Wild <mwild1@gmail.com>
parents: 2473
diff changeset
52
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat;
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54
5179
f3662fea95d9 mod_bosh: Share sessions and inactive_sessions tables
Matthew Wild <mwild1@gmail.com>
parents: 5071
diff changeset
55 -- All sessions, and sessions that have no requests open
7506
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
56 local sessions = module:shared("sessions");
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57
9990
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
58 local measure_active = module:measure("active_sessions", "amount");
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
59 local measure_inactive = module:measure("inactive_sessions", "amount");
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
60 local report_bad_host = module:measure("bad_host", "rate");
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
61 local report_bad_sid = module:measure("bad_sid", "rate");
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
62 local report_new_sid = module:measure("new_sid", "rate");
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
63 local report_timeout = module:measure("timeout", "rate");
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
64
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
65 module:hook("stats-update", function ()
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
66 local active = 0;
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
67 local inactive = 0;
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
68 for _, session in pairs(sessions) do
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
69 if #session.requests > 0 then
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
70 active = active + 1;
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
71 else
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
72 inactive = inactive + 1;
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
73 end
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
74 end
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
75 measure_active(active);
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
76 measure_inactive(inactive);
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
77 end);
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
78
679
9506bf204b1a Numerous BOSH improvements... handle client disconnects, either explicit or implicit through inactivity; allow specifying BOSH default parameters through config; fix to prevent prematurely closing request connections in some cases, before they were replied to
Matthew Wild <mwild1@gmail.com>
parents: 660
diff changeset
79 -- Used to respond to idle sessions (those with waiting requests)
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 function on_destroy_request(request)
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
81 log("debug", "Request destroyed: %s", request);
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
82 local session = sessions[request.context.sid];
816
c031ead9896d mod_bosh: Possible fix for invalid key to next crash
Matthew Wild <mwild1@gmail.com>
parents: 772
diff changeset
83 if session then
c031ead9896d mod_bosh: Possible fix for invalid key to next crash
Matthew Wild <mwild1@gmail.com>
parents: 772
diff changeset
84 local requests = session.requests;
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
85 for i, r in ipairs(requests) do
3039
2fef108d7eb7 mod_bosh: Remove requests from the session table using table.remove(), prevents the possibility of holes in the array.
Matthew Wild <mwild1@gmail.com>
parents: 2959
diff changeset
86 if r == request then
2fef108d7eb7 mod_bosh: Remove requests from the session table using table.remove(), prevents the possibility of holes in the array.
Matthew Wild <mwild1@gmail.com>
parents: 2959
diff changeset
87 t_remove(requests, i);
2fef108d7eb7 mod_bosh: Remove requests from the session table using table.remove(), prevents the possibility of holes in the array.
Matthew Wild <mwild1@gmail.com>
parents: 2959
diff changeset
88 break;
2fef108d7eb7 mod_bosh: Remove requests from the session table using table.remove(), prevents the possibility of holes in the array.
Matthew Wild <mwild1@gmail.com>
parents: 2959
diff changeset
89 end
816
c031ead9896d mod_bosh: Possible fix for invalid key to next crash
Matthew Wild <mwild1@gmail.com>
parents: 772
diff changeset
90 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
91
816
c031ead9896d mod_bosh: Possible fix for invalid key to next crash
Matthew Wild <mwild1@gmail.com>
parents: 772
diff changeset
92 -- If this session now has no requests open, mark it as inactive
4436
aa79b3767f98 mod_bosh: Store time to destroy session in inactive_sessions, removing dependency on session.bosh_max_inactive in cleanup timer
Matthew Wild <mwild1@gmail.com>
parents: 4379
diff changeset
93 local max_inactive = session.bosh_max_inactive;
aa79b3767f98 mod_bosh: Store time to destroy session in inactive_sessions, removing dependency on session.bosh_max_inactive in cleanup timer
Matthew Wild <mwild1@gmail.com>
parents: 4379
diff changeset
94 if max_inactive and #requests == 0 then
7506
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
95 if session.inactive_timer then
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
96 session.inactive_timer:stop();
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
97 end
9990
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
98 session.inactive_timer = module:add_timer(max_inactive, session_timeout, session, request.context,
7506
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
99 "BOSH client silent for over "..max_inactive.." seconds");
4436
aa79b3767f98 mod_bosh: Store time to destroy session in inactive_sessions, removing dependency on session.bosh_max_inactive in cleanup timer
Matthew Wild <mwild1@gmail.com>
parents: 4379
diff changeset
100 (session.log or log)("debug", "BOSH session marked as inactive (for %ds)", max_inactive);
816
c031ead9896d mod_bosh: Possible fix for invalid key to next crash
Matthew Wild <mwild1@gmail.com>
parents: 772
diff changeset
101 end
7506
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
102 if session.bosh_wait_timer then
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
103 session.bosh_wait_timer:stop();
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
104 session.bosh_wait_timer = nil;
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
105 end
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
106 end
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
107 end
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
108
9990
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
109 function session_timeout(now, session, context, reason) -- luacheck: ignore 212/now
7655
132819f409dc mod_bosh: Fix typo
Matthew Wild <mwild1@gmail.com>
parents: 7654
diff changeset
110 if not session.destroyed then
9990
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
111 report_timeout();
7506
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
112 sessions[context.sid] = nil;
8cca24bea3e0 mod_bosh: Fix merge mistakes from c8923f882274
Kim Alvefur <zash@zash.se>
parents: 7391
diff changeset
113 sm_destroy_session(session, reason);
816
c031ead9896d mod_bosh: Possible fix for invalid key to next crash
Matthew Wild <mwild1@gmail.com>
parents: 772
diff changeset
114 end
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 end
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
117 function handle_POST(event)
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
118 log("debug", "Handling new request %s: %s\n----------", event.request, event.request.body);
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
119
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
120 local request, response = event.request, event.response;
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
121 response.on_destroy = on_destroy_request;
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
122 local body = request.body;
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
123
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
124 local context = { request = request, response = response, notopen = true };
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
125 local stream = new_xmpp_stream(context, stream_callbacks);
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
126 response.context = context;
5648
f7f667c48d9a mod_bosh: Clean up handling of response headers, set them only in one place
Matthew Wild <mwild1@gmail.com>
parents: 5647
diff changeset
127
f7f667c48d9a mod_bosh: Clean up handling of response headers, set them only in one place
Matthew Wild <mwild1@gmail.com>
parents: 5647
diff changeset
128 local headers = response.headers;
f7f667c48d9a mod_bosh: Clean up handling of response headers, set them only in one place
Matthew Wild <mwild1@gmail.com>
parents: 5647
diff changeset
129 headers.content_type = "text/xml; charset=utf-8";
f7f667c48d9a mod_bosh: Clean up handling of response headers, set them only in one place
Matthew Wild <mwild1@gmail.com>
parents: 5647
diff changeset
130
3707
79f62694d36e mod_bosh: Switch to util.xmppstream from xmlhandlers
Matthew Wild <mwild1@gmail.com>
parents: 3684
diff changeset
131 -- stream:feed() calls the stream_callbacks, so all stanzas in
79f62694d36e mod_bosh: Switch to util.xmppstream from xmlhandlers
Matthew Wild <mwild1@gmail.com>
parents: 3684
diff changeset
132 -- the body are processed in this next line before it returns.
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
133 -- In particular, the streamopened() stream callback is where
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
134 -- much of the session logic happens, because it's where we first
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
135 -- get to see the 'sid' of this request.
7376
f9a5d9f60561 mod_bosh: Log error returned from stream:feed()
Kim Alvefur <zash@zash.se>
parents: 7375
diff changeset
136 local ok, err = stream:feed(body);
f9a5d9f60561 mod_bosh: Log error returned from stream:feed()
Kim Alvefur <zash@zash.se>
parents: 7375
diff changeset
137 if not ok then
f9a5d9f60561 mod_bosh: Log error returned from stream:feed()
Kim Alvefur <zash@zash.se>
parents: 7375
diff changeset
138 module:log("warn", "Error parsing BOSH payload; %s", err)
7377
6c98e783272a mod_bosh: Return a proper BOSH error response instead of deprecated(?) status code (See #343)
Kim Alvefur <zash@zash.se>
parents: 7376
diff changeset
139 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate",
6c98e783272a mod_bosh: Return a proper BOSH error response instead of deprecated(?) status code (See #343)
Kim Alvefur <zash@zash.se>
parents: 7376
diff changeset
140 ["xmlns:stream"] = xmlns_streams, condition = "bad-request" });
6c98e783272a mod_bosh: Return a proper BOSH error response instead of deprecated(?) status code (See #343)
Kim Alvefur <zash@zash.se>
parents: 7376
diff changeset
141 return tostring(close_reply);
5647
8767b47524c9 mod_bosh: Return errors when appropriate (invalid XML, missing sid)
Matthew Wild <mwild1@gmail.com>
parents: 5646
diff changeset
142 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
143
4438
7f51186ed28b mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
Matthew Wild <mwild1@gmail.com>
parents: 4437
diff changeset
144 -- Stanzas (if any) in the request have now been processed, and
7f51186ed28b mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
Matthew Wild <mwild1@gmail.com>
parents: 4437
diff changeset
145 -- we take care of the high-level BOSH logic here, including
7f51186ed28b mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
Matthew Wild <mwild1@gmail.com>
parents: 4437
diff changeset
146 -- giving a response or putting the request "on hold".
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
147 local session = sessions[context.sid];
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 if session then
4308
50e1a3dc2b50 mod_bosh: Mark a session as active when a request comes in, even if we don't end up holding that request, fixes BOSH ghosts (thanks smoku)
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
149 -- Session was marked as inactive, since we have
50e1a3dc2b50 mod_bosh: Mark a session as active when a request comes in, even if we don't end up holding that request, fixes BOSH ghosts (thanks smoku)
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
150 -- a request open now, unmark it
6989
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
151 if session.inactive_timer and #session.requests > 0 then
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
152 session.inactive_timer:stop();
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
153 session.inactive_timer = nil;
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
154 end
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
155
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
156 if session.bosh_wait_timer then
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
157 session.bosh_wait_timer:stop();
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
158 session.bosh_wait_timer = nil;
4308
50e1a3dc2b50 mod_bosh: Mark a session as active when a request comes in, even if we don't end up holding that request, fixes BOSH ghosts (thanks smoku)
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
159 end
4000
ca91d6e1d802 mod_bosh: Fix for miscalculating inactivity, causing disconnects under a steady stream of traffic
Matthew Wild <mwild1@gmail.com>
parents: 3725
diff changeset
160
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 local r = session.requests;
7653
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
162 log("debug", "Session %s has %d out of %d requests open", context.sid, #r, BOSH_HOLD);
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
163 log("debug", "and there are %d things in the send_buffer:", #session.send_buffer);
7653
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
164 if #r > BOSH_HOLD then
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 -- We are holding too many requests, send what's in the buffer,
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 log("debug", "We are holding too many requests, so...");
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 if #session.send_buffer > 0 then
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 log("debug", "...sending what is in the buffer")
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 session.send(t_concat(session.send_buffer));
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 session.send_buffer = {};
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 else
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 -- or an empty response
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 log("debug", "...sending an empty response");
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 session.send("");
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 end
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 elseif #session.send_buffer > 0 then
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 log("debug", "Session has data in the send buffer, will send now..");
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 local resp = t_concat(session.send_buffer);
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 session.send_buffer = {};
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 session.send(resp);
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
182
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
183 if not response.finished then
3042
b1961f6c9853 mod_bosh: Always give requests a destroy handler, so that the management of each session's request array and the inactive_sessions logic can happen in one place. Simplifies everything and concludes this series of BOSH fixes.
Matthew Wild <mwild1@gmail.com>
parents: 3041
diff changeset
184 -- We're keeping this request open, to respond later
b1961f6c9853 mod_bosh: Always give requests a destroy handler, so that the management of each session's request array and the inactive_sessions logic can happen in one place. Simplifies everything and concludes this series of BOSH fixes.
Matthew Wild <mwild1@gmail.com>
parents: 3041
diff changeset
185 log("debug", "Have nothing to say, so leaving request unanswered for now");
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
187
4223
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
188 if session.bosh_terminate then
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
189 session.log("debug", "Closing session with %d requests open", #session.requests);
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
190 session:close();
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
191 return nil;
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
192 else
7656
296543556065 mod_bosh: Update BOSH wait timeout logic to work despite the addition of deferred requests
Matthew Wild <mwild1@gmail.com>
parents: 7655
diff changeset
193 if session.bosh_wait and #session.requests > 0 then
296543556065 mod_bosh: Update BOSH wait timeout logic to work despite the addition of deferred requests
Matthew Wild <mwild1@gmail.com>
parents: 7655
diff changeset
194 session.bosh_wait_timer = module:add_timer(session.bosh_wait, after_bosh_wait, session.requests[1], session)
296543556065 mod_bosh: Update BOSH wait timeout logic to work despite the addition of deferred requests
Matthew Wild <mwild1@gmail.com>
parents: 7655
diff changeset
195 end
296543556065 mod_bosh: Update BOSH wait timeout logic to work despite the addition of deferred requests
Matthew Wild <mwild1@gmail.com>
parents: 7655
diff changeset
196
4738
e95458712782 mod_bosh: Remove unused import of net.httpserver
Matthew Wild <mwild1@gmail.com>
parents: 4725
diff changeset
197 return true; -- Inform http server we shall reply later
4223
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
198 end
8765
d5ff0982d3e6 mod_bosh: Fix for 7be8f649d97d to skip error handling and allow other modules to handle the request
Matthew Wild <mwild1@gmail.com>
parents: 8752
diff changeset
199 elseif response.finished or context.ignore_request then
8918
f69b3e39e0c1 mod_bosh: Add extra debug logging to help with #1134
Kim Alvefur <zash@zash.se>
parents: 8843
diff changeset
200 if response.finished then
f69b3e39e0c1 mod_bosh: Add extra debug logging to help with #1134
Kim Alvefur <zash@zash.se>
parents: 8843
diff changeset
201 module:log("debug", "Response finished");
f69b3e39e0c1 mod_bosh: Add extra debug logging to help with #1134
Kim Alvefur <zash@zash.se>
parents: 8843
diff changeset
202 end
f69b3e39e0c1 mod_bosh: Add extra debug logging to help with #1134
Kim Alvefur <zash@zash.se>
parents: 8843
diff changeset
203 if context.ignore_request then
f69b3e39e0c1 mod_bosh: Add extra debug logging to help with #1134
Kim Alvefur <zash@zash.se>
parents: 8843
diff changeset
204 module:log("debug", "Ignoring this request");
f69b3e39e0c1 mod_bosh: Add extra debug logging to help with #1134
Kim Alvefur <zash@zash.se>
parents: 8843
diff changeset
205 end
8767
7738838a013d mod_bosh: Fix inconsistent whitespace [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8765
diff changeset
206 -- A response has been sent already, or we're ignoring this request
7738838a013d mod_bosh: Fix inconsistent whitespace [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8765
diff changeset
207 -- (e.g. so a different instance of the module can handle it)
8765
d5ff0982d3e6 mod_bosh: Fix for 7be8f649d97d to skip error handling and allow other modules to handle the request
Matthew Wild <mwild1@gmail.com>
parents: 8752
diff changeset
208 return;
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 end
5647
8767b47524c9 mod_bosh: Return errors when appropriate (invalid XML, missing sid)
Matthew Wild <mwild1@gmail.com>
parents: 5646
diff changeset
210 module:log("warn", "Unable to associate request with a session (incomplete request?)");
9990
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
211 report_bad_sid();
7377
6c98e783272a mod_bosh: Return a proper BOSH error response instead of deprecated(?) status code (See #343)
Kim Alvefur <zash@zash.se>
parents: 7376
diff changeset
212 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate",
6c98e783272a mod_bosh: Return a proper BOSH error response instead of deprecated(?) status code (See #343)
Kim Alvefur <zash@zash.se>
parents: 7376
diff changeset
213 ["xmlns:stream"] = xmlns_streams, condition = "item-not-found" });
6c98e783272a mod_bosh: Return a proper BOSH error response instead of deprecated(?) status code (See #343)
Kim Alvefur <zash@zash.se>
parents: 7376
diff changeset
214 return tostring(close_reply) .. "\n";
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 end
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216
7391
c381106173d0 mod_bosh: Add annotations to ignore unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7390
diff changeset
217 function after_bosh_wait(now, request, session) -- luacheck: ignore 212
6989
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
218 if request.conn then
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
219 session.send("");
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
220 end
118858bf47cd mod_bosh: Instead of a global once-per-second timer add a timer for each session when needed
Kim Alvefur <zash@zash.se>
parents: 6528
diff changeset
221 end
684
b7d85c6a0002 Implement session:close() for BOSH, and add checking for attempts to connect to hosts we don't serve
Matthew Wild <mwild1@gmail.com>
parents: 683
diff changeset
222
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 local function bosh_reset_stream(session) session.notopen = true; end
684
b7d85c6a0002 Implement session:close() for BOSH, and add checking for attempts to connect to hosts we don't serve
Matthew Wild <mwild1@gmail.com>
parents: 683
diff changeset
224
3448
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
225 local stream_xmlns_attr = { xmlns = "urn:ietf:params:xml:ns:xmpp-streams" };
684
b7d85c6a0002 Implement session:close() for BOSH, and add checking for attempts to connect to hosts we don't serve
Matthew Wild <mwild1@gmail.com>
parents: 683
diff changeset
226 local function bosh_close_stream(session, reason)
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
227 (session.log or log)("info", "BOSH client disconnected: %s", (reason and reason.condition or reason) or "session close");
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
228
3448
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
229 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate",
4379
e4d88f4a780c mod_bosh: s/xmlns:streams/xmlns:stream/ - fixes #265 (thanks Tim)
Matthew Wild <mwild1@gmail.com>
parents: 4332
diff changeset
230 ["xmlns:stream"] = xmlns_streams });
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
231
3448
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
232
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
233 if reason then
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
234 close_reply.attr.condition = "remote-stream-error";
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
235 if type(reason) == "string" then -- assume stream error
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
236 close_reply:tag("stream:error")
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
237 :tag(reason, {xmlns = xmlns_xmpp_streams});
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
238 elseif type(reason) == "table" then
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
239 if reason.condition then
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
240 close_reply:tag("stream:error")
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
241 :tag(reason.condition, stream_xmlns_attr):up();
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
242 if reason.text then
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
243 close_reply:tag("text", stream_xmlns_attr):text(reason.text):up();
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
244 end
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
245 if reason.extra then
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
246 close_reply:add_child(reason.extra);
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
247 end
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
248 elseif reason.name then -- a stanza
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
249 close_reply = reason;
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
250 end
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
251 end
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
252 log("info", "Disconnecting client, <stream:error> is: %s", close_reply);
3448
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
253 end
0ca7c3864431 mod_bosh: Much improve session:close() for BOSH sessions, so it now matches in usage normal session:close()
Matthew Wild <mwild1@gmail.com>
parents: 3447
diff changeset
254
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
255 local response_body = tostring(close_reply);
684
b7d85c6a0002 Implement session:close() for BOSH, and add checking for attempts to connect to hosts we don't serve
Matthew Wild <mwild1@gmail.com>
parents: 683
diff changeset
256 for _, held_request in ipairs(session.requests) do
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
257 held_request:send(response_body);
684
b7d85c6a0002 Implement session:close() for BOSH, and add checking for attempts to connect to hosts we don't serve
Matthew Wild <mwild1@gmail.com>
parents: 683
diff changeset
258 end
5634
7298c9bbb30f mod_bosh: Some very minor whitespace/layout fixes
Matthew Wild <mwild1@gmail.com>
parents: 5188
diff changeset
259 sessions[session.sid] = nil;
684
b7d85c6a0002 Implement session:close() for BOSH, and add checking for attempts to connect to hosts we don't serve
Matthew Wild <mwild1@gmail.com>
parents: 683
diff changeset
260 sm_destroy_session(session);
b7d85c6a0002 Implement session:close() for BOSH, and add checking for attempts to connect to hosts we don't serve
Matthew Wild <mwild1@gmail.com>
parents: 683
diff changeset
261 end
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262
6528
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
263 local runner_callbacks = { };
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
264
4438
7f51186ed28b mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
Matthew Wild <mwild1@gmail.com>
parents: 4437
diff changeset
265 -- Handle the <body> tag in the request payload.
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
266 function stream_callbacks.streamopened(context, attr)
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
267 local request, response = context.request, context.response;
8747
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
268 local sid, rid = attr.sid, tonumber(attr.rid);
4327
98ae0d0b4d07 mod_bosh: Fix logging when no sid present, fix a missing semi-colon, avoid an extra useless table lookup (thanks Thomas)
Matthew Wild <mwild1@gmail.com>
parents: 4316
diff changeset
269 log("debug", "BOSH body open (sid: %s)", sid or "<none>");
8747
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
270 context.rid = rid;
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 if not sid then
679
9506bf204b1a Numerous BOSH improvements... handle client disconnects, either explicit or implicit through inactivity; allow specifying BOSH default parameters through config; fix to prevent prematurely closing request connections in some cases, before they were replied to
Matthew Wild <mwild1@gmail.com>
parents: 660
diff changeset
272 -- New session request
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
273 context.notopen = nil; -- Signals that we accept this opening tag
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
274
10377
4c36bc28b99e mod_bosh: Abort early if request is missing hostname
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
275 if not attr.to then
4c36bc28b99e mod_bosh: Abort early if request is missing hostname
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
276 log("debug", "BOSH client tried to connect without specifying a host");
4c36bc28b99e mod_bosh: Abort early if request is missing hostname
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
277 report_bad_host();
4c36bc28b99e mod_bosh: Abort early if request is missing hostname
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
278 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate",
4c36bc28b99e mod_bosh: Abort early if request is missing hostname
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
279 ["xmlns:stream"] = xmlns_streams, condition = "improper-addressing" });
4c36bc28b99e mod_bosh: Abort early if request is missing hostname
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
280 response:send(tostring(close_reply));
4c36bc28b99e mod_bosh: Abort early if request is missing hostname
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
281 return;
4c36bc28b99e mod_bosh: Abort early if request is missing hostname
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
282 end
4c36bc28b99e mod_bosh: Abort early if request is missing hostname
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
283
7378
d15cfe8627ad mod_bosh: Validate 'to' host (see #343)
Kim Alvefur <zash@zash.se>
parents: 7377
diff changeset
284 local to_host = nameprep(attr.to);
7379
250855633092 mod_bosh: Validate that 'sid' and 'wait' have sane values (fixes #475, also see #343)
Kim Alvefur <zash@zash.se>
parents: 7378
diff changeset
285 local wait = tonumber(attr.wait);
7378
d15cfe8627ad mod_bosh: Validate 'to' host (see #343)
Kim Alvefur <zash@zash.se>
parents: 7377
diff changeset
286 if not to_host then
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
287 log("debug", "BOSH client tried to connect to invalid host: %s", attr.to);
9990
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
288 report_bad_host();
7378
d15cfe8627ad mod_bosh: Validate 'to' host (see #343)
Kim Alvefur <zash@zash.se>
parents: 7377
diff changeset
289 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate",
d15cfe8627ad mod_bosh: Validate 'to' host (see #343)
Kim Alvefur <zash@zash.se>
parents: 7377
diff changeset
290 ["xmlns:stream"] = xmlns_streams, condition = "improper-addressing" });
d15cfe8627ad mod_bosh: Validate 'to' host (see #343)
Kim Alvefur <zash@zash.se>
parents: 7377
diff changeset
291 response:send(tostring(close_reply));
d15cfe8627ad mod_bosh: Validate 'to' host (see #343)
Kim Alvefur <zash@zash.se>
parents: 7377
diff changeset
292 return;
684
b7d85c6a0002 Implement session:close() for BOSH, and add checking for attempts to connect to hosts we don't serve
Matthew Wild <mwild1@gmail.com>
parents: 683
diff changeset
293 end
9777
2e07d2f71599 mod_bosh: Handle missing wait attribute (fixes #1288)
Kim Alvefur <zash@zash.se>
parents: 9380
diff changeset
294 if not rid or (not attr.wait or not wait or wait < 0 or wait % 1 ~= 0) then
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
295 log("debug", "BOSH client sent invalid rid or wait attributes: rid=%s, wait=%s", attr.rid, attr.wait);
7379
250855633092 mod_bosh: Validate that 'sid' and 'wait' have sane values (fixes #475, also see #343)
Kim Alvefur <zash@zash.se>
parents: 7378
diff changeset
296 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate",
250855633092 mod_bosh: Validate that 'sid' and 'wait' have sane values (fixes #475, also see #343)
Kim Alvefur <zash@zash.se>
parents: 7378
diff changeset
297 ["xmlns:stream"] = xmlns_streams, condition = "bad-request" });
250855633092 mod_bosh: Validate that 'sid' and 'wait' have sane values (fixes #475, also see #343)
Kim Alvefur <zash@zash.se>
parents: 7378
diff changeset
298 response:send(tostring(close_reply));
250855633092 mod_bosh: Validate that 'sid' and 'wait' have sane values (fixes #475, also see #343)
Kim Alvefur <zash@zash.se>
parents: 7378
diff changeset
299 return;
250855633092 mod_bosh: Validate that 'sid' and 'wait' have sane values (fixes #475, also see #343)
Kim Alvefur <zash@zash.se>
parents: 7378
diff changeset
300 end
250855633092 mod_bosh: Validate that 'sid' and 'wait' have sane values (fixes #475, also see #343)
Kim Alvefur <zash@zash.se>
parents: 7378
diff changeset
301
250855633092 mod_bosh: Validate that 'sid' and 'wait' have sane values (fixes #475, also see #343)
Kim Alvefur <zash@zash.se>
parents: 7378
diff changeset
302 wait = math_min(wait, bosh_max_wait);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
303
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 -- New session
763
8e77a39826c2 mod_bosh: No need to tostring() uuids now
Matthew Wild <mwild1@gmail.com>
parents: 725
diff changeset
305 sid = new_uuid();
3071
39a870ae75d9 mod_bosh: Re-layout session object creation to make lines shorter
Matthew Wild <mwild1@gmail.com>
parents: 3070
diff changeset
306 local session = {
8747
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
307 type = "c2s_unauthed", conn = request.conn, sid = sid, host = attr.to,
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
308 rid = rid - 1, -- Hack for initial session setup, "previous" rid was $current_request - 1
7379
250855633092 mod_bosh: Validate that 'sid' and 'wait' have sane values (fixes #475, also see #343)
Kim Alvefur <zash@zash.se>
parents: 7378
diff changeset
309 bosh_version = attr.ver, bosh_wait = wait, streamid = sid,
8752
8f2da579a790 mod_bosh: Increase number of stored responses to ensure we always keep responses within the rid window available
Matthew Wild <mwild1@gmail.com>
parents: 8747
diff changeset
310 bosh_max_inactive = bosh_max_inactivity, bosh_responses = cache.new(BOSH_HOLD+1):table();
3071
39a870ae75d9 mod_bosh: Re-layout session object creation to make lines shorter
Matthew Wild <mwild1@gmail.com>
parents: 3070
diff changeset
311 requests = { }, send_buffer = {}, reset_stream = bosh_reset_stream,
5071
0382f456ac82 mod_bosh: Remove redundant code (send stream features in only one place) (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 5070
diff changeset
312 close = bosh_close_stream, dispatch_stanza = core_process_stanza, notopen = true,
3472
61cf3e7d7f07 mod_bosh: Support for reading the client's real IP through HTTP proxies from X-Forwarded-For
Matthew Wild <mwild1@gmail.com>
parents: 3460
diff changeset
313 log = logger.init("bosh"..sid), secure = consider_bosh_secure or request.secure,
8594
b4a0bc46c82d mod_http: Set request.ip on all HTTP requests (moves code out of mod_bosh) (fixes #540)
Kim Alvefur <zash@zash.se>
parents: 8525
diff changeset
314 ip = request.ip;
3071
39a870ae75d9 mod_bosh: Re-layout session object creation to make lines shorter
Matthew Wild <mwild1@gmail.com>
parents: 3070
diff changeset
315 };
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 sessions[sid] = session;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
317
6528
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
318 session.thread = runner(function (stanza)
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
319 session:dispatch_stanza(stanza);
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
320 end, runner_callbacks, session);
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
321
5187
d71f731e8fe4 mod_bosh: Add support for stanza filters to BOSH sessions (needed by some plugins)
Matthew Wild <mwild1@gmail.com>
parents: 5185
diff changeset
322 local filter = initialize_filters(session);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
323
3472
61cf3e7d7f07 mod_bosh: Support for reading the client's real IP through HTTP proxies from X-Forwarded-For
Matthew Wild <mwild1@gmail.com>
parents: 3460
diff changeset
324 session.log("debug", "BOSH session created for request from %s", session.ip);
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 log("info", "New BOSH session, assigned it sid '%s'", sid);
9990
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
326 report_new_sid();
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
327
8493
d424fe42b4d2 mod_bosh: Use module API to fire events
Kim Alvefur <zash@zash.se>
parents: 8492
diff changeset
328 module:fire_event("bosh-session", { session = session, request = request });
7047
9ca2b720ad43 mod_bosh: Fire event when BOSH session is created
Matthew Wild <mwild1@gmail.com>
parents: 6528
diff changeset
329
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
330 -- Send creation response
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
331 local creating_session = true;
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
332
4769
c91bb217bf79 mod_bosh: Remove unused send_buffer variable
Matthew Wild <mwild1@gmail.com>
parents: 4768
diff changeset
333 local r = session.requests;
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 function session.send(s)
3322
c4e107e7c883 mod_bosh: Add jabber:client namespace to stanzas with no namespace
Matthew Wild <mwild1@gmail.com>
parents: 3071
diff changeset
335 -- We need to ensure that outgoing stanzas have the jabber:client xmlns
c4e107e7c883 mod_bosh: Add jabber:client namespace to stanzas with no namespace
Matthew Wild <mwild1@gmail.com>
parents: 3071
diff changeset
336 if s.attr and not s.attr.xmlns then
c4e107e7c883 mod_bosh: Add jabber:client namespace to stanzas with no namespace
Matthew Wild <mwild1@gmail.com>
parents: 3071
diff changeset
337 s = st.clone(s);
c4e107e7c883 mod_bosh: Add jabber:client namespace to stanzas with no namespace
Matthew Wild <mwild1@gmail.com>
parents: 3071
diff changeset
338 s.attr.xmlns = "jabber:client";
c4e107e7c883 mod_bosh: Add jabber:client namespace to stanzas with no namespace
Matthew Wild <mwild1@gmail.com>
parents: 3071
diff changeset
339 end
5187
d71f731e8fe4 mod_bosh: Add support for stanza filters to BOSH sessions (needed by some plugins)
Matthew Wild <mwild1@gmail.com>
parents: 5185
diff changeset
340 s = filter("stanzas/out", s);
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
341 --log("debug", "Sending BOSH data: %s", s);
7326
d11701e86702 mod_bosh: Skip sending stanzas removed out by filters (fixes #657)
Kim Alvefur <zash@zash.se>
parents: 7283
diff changeset
342 if not s then return true end
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
343 t_insert(session.send_buffer, tostring(s));
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
344
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 local oldest_request = r[1];
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
346 if oldest_request and not session.bosh_processing then
2099
73e083d01449 mod_bosh: Don't log response XML
Matthew Wild <mwild1@gmail.com>
parents: 2084
diff changeset
347 log("debug", "We have an open request, so sending on that");
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
348 local body_attr = { xmlns = "http://jabber.org/protocol/httpbind",
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
349 ["xmlns:stream"] = "http://etherx.jabber.org/streams";
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
350 type = session.bosh_terminate and "terminate" or nil;
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
351 sid = sid;
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
352 };
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
353 if creating_session then
5644
f9cfe6f5d60f mod_bosh: Reset creating_session to prevent putting unnecessary attributes into every BOSH response
Matthew Wild <mwild1@gmail.com>
parents: 5639
diff changeset
354 creating_session = nil;
7653
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
355 body_attr.requests = tostring(BOSH_MAX_REQUESTS);
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
356 body_attr.hold = tostring(BOSH_HOLD);
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
357 body_attr.inactivity = tostring(bosh_max_inactivity);
17e42f793341 mod_bosh: Make 'hold' and 'requests' fixed to '1' and '2' respectively, as this is what all implementations realistically use
Matthew Wild <mwild1@gmail.com>
parents: 7652
diff changeset
358 body_attr.polling = tostring(bosh_max_polling);
5185
ca30b21946ef mod_bosh: Add bosh_max_wait config option, to limit the amount of time a client can request for the server to hold open requests
Matthew Wild <mwild1@gmail.com>
parents: 5179
diff changeset
359 body_attr.wait = tostring(session.bosh_wait);
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
360 body_attr.authid = sid;
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
361 body_attr.secure = "true";
5670
9218a0e81a41 mod_bosh: Fix global write
Matthew Wild <mwild1@gmail.com>
parents: 5650
diff changeset
362 body_attr.ver = '1.6';
9218a0e81a41 mod_bosh: Fix global write
Matthew Wild <mwild1@gmail.com>
parents: 5650
diff changeset
363 body_attr.from = session.host;
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
364 body_attr["xmlns:xmpp"] = "urn:xmpp:xbosh";
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
365 body_attr["xmpp:version"] = "1.0";
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
366 end
8747
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
367 local response_xml = st.stanza("body", body_attr):top_tag()..t_concat(session.send_buffer).."</body>";
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
368 session.bosh_responses[oldest_request.context.rid] = response_xml;
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
369 oldest_request:send(response_xml);
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
370 session.send_buffer = {};
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 end
4102
9df4e61c260b mod_bosh: Return true from send()
Matthew Wild <mwild1@gmail.com>
parents: 4000
diff changeset
372 return true;
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 end
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374 request.sid = sid;
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
376
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
377 local session = sessions[sid];
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378 if not session then
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 -- Unknown sid
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 log("info", "Client tried to use sid '%s' which we don't know about", sid);
9990
f122972b77b2 mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
Arc Riley <arcriley@gmail.com>
parents: 9799
diff changeset
381 report_bad_sid();
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
382 response:send(tostring(st.stanza("body", { xmlns = xmlns_bosh, type = "terminate", condition = "item-not-found" })));
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
383 context.notopen = nil;
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 return;
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 end
8093
8d1fd6d34bda mod_bosh: Update session.conn to point to the current connection (fixes #890)
Kim Alvefur <zash@zash.se>
parents: 5727
diff changeset
386
8d1fd6d34bda mod_bosh: Update session.conn to point to the current connection (fixes #890)
Kim Alvefur <zash@zash.se>
parents: 5727
diff changeset
387 session.conn = request.conn;
8097
e24263db3380 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7659 8093
diff changeset
388
1663
b30c4d0bbe84 mod_bosh: Basic handling of rids (more to come)
Matthew Wild <mwild1@gmail.com>
parents: 1662
diff changeset
389 if session.rid then
1664
6587b6c2678e mod_bosh: Calculate rid difference just once
Matthew Wild <mwild1@gmail.com>
parents: 1663
diff changeset
390 local diff = rid - session.rid;
7651
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
391 -- Diff should be 1 for a healthy request
8747
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
392 session.log("debug", "rid: %d, sess: %s, diff: %d", rid, session.rid, diff)
7651
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
393 if diff ~= 1 then
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
394 context.sid = sid;
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
395 context.notopen = nil;
8746
df1ca586c68d mod_bosh: Some additonal comments to improve code readability
Matthew Wild <mwild1@gmail.com>
parents: 8745
diff changeset
396 if diff == 2 then -- Missed a request
7651
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
397 -- Hold request, but don't process it (ouch!)
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
398 session.log("debug", "rid skipped: %d, deferring this request", rid-1)
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
399 context.defer = true;
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
400 session.bosh_deferred = { context = context, sid = sid, rid = rid, terminate = attr.type == "terminate" };
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
401 return;
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
402 end
8746
df1ca586c68d mod_bosh: Some additonal comments to improve code readability
Matthew Wild <mwild1@gmail.com>
parents: 8745
diff changeset
403 -- Set a marker to indicate that stanzas in this request should NOT be processed
df1ca586c68d mod_bosh: Some additonal comments to improve code readability
Matthew Wild <mwild1@gmail.com>
parents: 8745
diff changeset
404 -- (these stanzas will already be in the XML parser's buffer)
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
405 context.ignore = true;
8747
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
406 if session.bosh_responses[rid] then
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
407 -- Re-send past response, ignore stanzas in this request
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
408 session.log("debug", "rid repeated within window, replaying old response");
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
409 response:send(session.bosh_responses[rid]);
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
410 return;
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
411 elseif diff == 0 then
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
412 session.log("debug", "current rid repeated, ignoring stanzas");
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
413 t_insert(session.requests, response);
f91d45a692f0 mod_bosh: Improve connection robustness with better handling of unexpected rids
Matthew Wild <mwild1@gmail.com>
parents: 8746
diff changeset
414 context.sid = sid;
7651
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
415 return;
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
416 end
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
417 -- Session broken, destroy it
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
418 session.log("debug", "rid out of range: %d (diff %d)", rid, diff);
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
419 response:send(tostring(st.stanza("body", { xmlns = xmlns_bosh, type = "terminate", condition = "item-not-found" })));
1663
b30c4d0bbe84 mod_bosh: Basic handling of rids (more to come)
Matthew Wild <mwild1@gmail.com>
parents: 1662
diff changeset
420 return;
b30c4d0bbe84 mod_bosh: Basic handling of rids (more to come)
Matthew Wild <mwild1@gmail.com>
parents: 1662
diff changeset
421 end
b30c4d0bbe84 mod_bosh: Basic handling of rids (more to come)
Matthew Wild <mwild1@gmail.com>
parents: 1662
diff changeset
422 session.rid = rid;
b30c4d0bbe84 mod_bosh: Basic handling of rids (more to come)
Matthew Wild <mwild1@gmail.com>
parents: 1662
diff changeset
423 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
424
4223
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
425 if attr.type == "terminate" then
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
426 -- Client wants to end this session, which we'll do
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
427 -- after processing any stanzas in this request
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
428 session.bosh_terminate = true;
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
429 end
9fb6e8ec15ed mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
Matthew Wild <mwild1@gmail.com>
parents: 4102
diff changeset
430
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
431 context.notopen = nil; -- Signals that we accept this opening tag
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
432 t_insert(session.requests, response);
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
433 context.sid = sid;
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
434 session.bosh_processing = true; -- Used to suppress replies until processing of this request is done
4438
7f51186ed28b mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
Matthew Wild <mwild1@gmail.com>
parents: 4437
diff changeset
435
7f51186ed28b mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
Matthew Wild <mwild1@gmail.com>
parents: 4437
diff changeset
436 if session.notopen then
7f51186ed28b mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
Matthew Wild <mwild1@gmail.com>
parents: 4437
diff changeset
437 local features = st.stanza("stream:features");
9380
7425af27fc67 mod_bosh: Fire stream feature event on hosts (thanks gerald)
Kim Alvefur <zash@zash.se>
parents: 9377
diff changeset
438 module:context(session.host):fire_event("stream-features", { origin = session, features = features });
5658
97c1c1bdd7bc mod_bosh: Don't tostring() stream:features when passing to session.send().
Waqas Hussain <waqas20@gmail.com>
parents: 5654
diff changeset
439 session.send(features);
4438
7f51186ed28b mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
Matthew Wild <mwild1@gmail.com>
parents: 4437
diff changeset
440 session.notopen = nil;
7f51186ed28b mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
Matthew Wild <mwild1@gmail.com>
parents: 4437
diff changeset
441 end
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
442 end
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
443
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
444 local function handleerr(err) log("error", "Traceback[bosh]: %s", traceback(err, 2)); end
6528
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
445
7391
c381106173d0 mod_bosh: Add annotations to ignore unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7390
diff changeset
446 function runner_callbacks:error(err) -- luacheck: ignore 212/self
6528
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
447 return handleerr(err);
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
448 end
f0687c313cf1 mod_bosh: Use util.async
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
449
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
450 function stream_callbacks.handlestanza(context, stanza)
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
451 if context.ignore then return; end
725
96110075288b Replacing pretty_print() with top_tag() for logging
Matthew Wild <mwild1@gmail.com>
parents: 701
diff changeset
452 log("debug", "BOSH stanza received: %s\n", stanza:top_tag());
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
453 local session = sessions[context.sid];
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
454 if session then
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455 if stanza.attr.xmlns == xmlns_bosh then
2959
62a3f824292a mod_bosh: Default stanza namespace should be jabber:client (fixes BOSH to work with recent namespace fix)
Matthew Wild <mwild1@gmail.com>
parents: 2923
diff changeset
456 stanza.attr.xmlns = nil;
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
457 end
7651
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
458 if context.defer and session.bosh_deferred then
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
459 log("debug", "Deferring this stanza");
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
460 t_insert(session.bosh_deferred, stanza);
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
461 else
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
462 stanza = session.filter("stanzas/in", stanza);
7654
b40776ee2aef Merge 0.10->trunk
Matthew Wild <mwild1@gmail.com>
parents: 7506 7653
diff changeset
463 session.thread:run(stanza);
5726
3bccc68a38e3 mod_bosh: Only pass stanza to core_process_stanza if it wasn't dropped by filters
Matthew Wild <mwild1@gmail.com>
parents: 5671
diff changeset
464 end
7652
7cc3d6c764ce mod_bosh: Log when a stanza isn't handled because we can't find a session for it
Matthew Wild <mwild1@gmail.com>
parents: 7651
diff changeset
465 else
7cc3d6c764ce mod_bosh: Log when a stanza isn't handled because we can't find a session for it
Matthew Wild <mwild1@gmail.com>
parents: 7651
diff changeset
466 log("debug", "No session for this stanza! (sid: %s)", context.sid or "none!");
636
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
467 end
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
468 end
9c9c671ecc50 Initial mod_bosh, works, kind of, but quite incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
469
5635
84d3d7b69f9a mod_bosh: rename variable for clarity
Matthew Wild <mwild1@gmail.com>
parents: 5634
diff changeset
470 function stream_callbacks.streamclosed(context)
84d3d7b69f9a mod_bosh: rename variable for clarity
Matthew Wild <mwild1@gmail.com>
parents: 5634
diff changeset
471 local session = sessions[context.sid];
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
472 if session then
7651
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
473 if not context.defer and session.bosh_deferred then
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
474 -- Handle deferred stanzas now
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
475 local deferred_stanzas = session.bosh_deferred;
8491
f134be08a499 mod_bosh: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8490
diff changeset
476 local deferred_context = deferred_stanzas.context;
7651
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
477 session.bosh_deferred = nil;
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
478 log("debug", "Handling deferred stanzas from rid %d", deferred_stanzas.rid);
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
479 session.rid = deferred_stanzas.rid;
8491
f134be08a499 mod_bosh: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8490
diff changeset
480 t_insert(session.requests, deferred_context.response);
7651
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
481 for _, stanza in ipairs(deferred_stanzas) do
8491
f134be08a499 mod_bosh: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8490
diff changeset
482 stream_callbacks.handlestanza(deferred_context, stanza);
7651
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
483 end
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
484 if deferred_stanzas.terminate then
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
485 session.bosh_terminate = true;
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
486 end
55f11a6806bc mod_bosh: Correctly handle requests arriving out of order (thanks Jitsi folk!)
Matthew Wild <mwild1@gmail.com>
parents: 7387
diff changeset
487 end
5046
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
488 session.bosh_processing = false;
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
489 if #session.send_buffer > 0 then
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
490 session.send("");
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
491 end
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
492 end
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
493 end
16c7b510694b mod_bosh: Correctly handle data included in the session initiation request, and cork session while a request is being processed, preventing replying to requests when there may be more data to come, reducing round-trips.
Matthew Wild <mwild1@gmail.com>
parents: 5031
diff changeset
494
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
495 function stream_callbacks.error(context, error)
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
496 if not context.sid then
8744
0f4a4d8ac3dd mod_bosh: Improve logging - parse errors will now log through the session logger if possible
Matthew Wild <mwild1@gmail.com>
parents: 8743
diff changeset
497 log("debug", "Error parsing BOSH request payload; %s", error);
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
498 local response = context.response;
7380
d24d88feed76 mod_bosh: Return a proper BOSH error response from XML parse error callback (see #343)
Kim Alvefur <zash@zash.se>
parents: 7379
diff changeset
499 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate",
d24d88feed76 mod_bosh: Return a proper BOSH error response from XML parse error callback (see #343)
Kim Alvefur <zash@zash.se>
parents: 7379
diff changeset
500 ["xmlns:stream"] = xmlns_streams, condition = "bad-request" });
d24d88feed76 mod_bosh: Return a proper BOSH error response from XML parse error callback (see #343)
Kim Alvefur <zash@zash.se>
parents: 7379
diff changeset
501 response:send(tostring(close_reply));
3447
cc2dc55e66f9 mod_bosh: Add error callback for xmlhandlers, to handle the case of invalid or unusable XML in the request payload
Matthew Wild <mwild1@gmail.com>
parents: 3439
diff changeset
502 return;
cc2dc55e66f9 mod_bosh: Add error callback for xmlhandlers, to handle the case of invalid or unusable XML in the request payload
Matthew Wild <mwild1@gmail.com>
parents: 3439
diff changeset
503 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5748
diff changeset
504
4692
8e7c683d78ca mod_bosh: Large commit to update to mod_http/net.http.server APIs. Becomes a shared module.
Matthew Wild <mwild1@gmail.com>
parents: 4690
diff changeset
505 local session = sessions[context.sid];
8744
0f4a4d8ac3dd mod_bosh: Improve logging - parse errors will now log through the session logger if possible
Matthew Wild <mwild1@gmail.com>
parents: 8743
diff changeset
506 (session and session.log or log)("warn", "Error parsing BOSH request payload; %s", error);
3447
cc2dc55e66f9 mod_bosh: Add error callback for xmlhandlers, to handle the case of invalid or unusable XML in the request payload
Matthew Wild <mwild1@gmail.com>
parents: 3439
diff changeset
507 if error == "stream-error" then -- Remote stream error, we close normally
cc2dc55e66f9 mod_bosh: Add error callback for xmlhandlers, to handle the case of invalid or unusable XML in the request payload
Matthew Wild <mwild1@gmail.com>
parents: 3439
diff changeset
508 session:close();
cc2dc55e66f9 mod_bosh: Add error callback for xmlhandlers, to handle the case of invalid or unusable XML in the request payload
Matthew Wild <mwild1@gmail.com>
parents: 3439
diff changeset
509 else
cc2dc55e66f9 mod_bosh: Add error callback for xmlhandlers, to handle the case of invalid or unusable XML in the request payload
Matthew Wild <mwild1@gmail.com>
parents: 3439
diff changeset
510 session:close({ condition = "bad-format", text = "Error processing stream" });
cc2dc55e66f9 mod_bosh: Add error callback for xmlhandlers, to handle the case of invalid or unusable XML in the request payload
Matthew Wild <mwild1@gmail.com>
parents: 3439
diff changeset
511 end
cc2dc55e66f9 mod_bosh: Add error callback for xmlhandlers, to handle the case of invalid or unusable XML in the request payload
Matthew Wild <mwild1@gmail.com>
parents: 3439
diff changeset
512 end
cc2dc55e66f9 mod_bosh: Add error callback for xmlhandlers, to handle the case of invalid or unusable XML in the request payload
Matthew Wild <mwild1@gmail.com>
parents: 3439
diff changeset
513
4880
6d96e2e717c1 mod_bosh: Set Content-Type to text/html for GET response (thanks Medics)
Matthew Wild <mwild1@gmail.com>
parents: 4769
diff changeset
514 local GET_response = {
6d96e2e717c1 mod_bosh: Set Content-Type to text/html for GET response (thanks Medics)
Matthew Wild <mwild1@gmail.com>
parents: 4769
diff changeset
515 headers = {
6d96e2e717c1 mod_bosh: Set Content-Type to text/html for GET response (thanks Medics)
Matthew Wild <mwild1@gmail.com>
parents: 4769
diff changeset
516 content_type = "text/html";
6d96e2e717c1 mod_bosh: Set Content-Type to text/html for GET response (thanks Medics)
Matthew Wild <mwild1@gmail.com>
parents: 4769
diff changeset
517 };
6d96e2e717c1 mod_bosh: Set Content-Type to text/html for GET response (thanks Medics)
Matthew Wild <mwild1@gmail.com>
parents: 4769
diff changeset
518 body = [[<html><body>
6d96e2e717c1 mod_bosh: Set Content-Type to text/html for GET response (thanks Medics)
Matthew Wild <mwild1@gmail.com>
parents: 4769
diff changeset
519 <p>It works! Now point your BOSH client to this URL to connect to Prosody.</p>
7359
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7327
diff changeset
520 <p>For more information see <a href="https://prosody.im/doc/setting_up_bosh">Prosody: Setting up BOSH</a>.</p>
4880
6d96e2e717c1 mod_bosh: Set Content-Type to text/html for GET response (thanks Medics)
Matthew Wild <mwild1@gmail.com>
parents: 4769
diff changeset
521 </body></html>]];
6d96e2e717c1 mod_bosh: Set Content-Type to text/html for GET response (thanks Medics)
Matthew Wild <mwild1@gmail.com>
parents: 4769
diff changeset
522 };
6d96e2e717c1 mod_bosh: Set Content-Type to text/html for GET response (thanks Medics)
Matthew Wild <mwild1@gmail.com>
parents: 4769
diff changeset
523
8523
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
524 module:depends("http");
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
525 module:provides("http", {
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
526 default_path = "/http-bind";
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
527 route = {
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
528 ["GET"] = GET_response;
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
529 ["GET /"] = GET_response;
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
530 ["POST"] = handle_POST;
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
531 ["POST /"] = handle_POST;
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
532 };
30671b378ab5 mod_bosh: Make into a normal module (fixes #402)
Kim Alvefur <zash@zash.se>
parents: 8493
diff changeset
533 });