Comparison

plugins/mod_bosh.lua @ 4438:7f51186ed28b

mod_bosh: Move stream:features sending until after the current request has been added to session.requests. Ensures correct inactivity logic.
author Matthew Wild <mwild1@gmail.com>
date Wed, 07 Dec 2011 04:57:51 +0000
parent 4437:916681a9a7be
child 4442:bc0a68cae236
comparison
equal deleted inserted replaced
4437:916681a9a7be 4438:7f51186ed28b
118 request.notopen = true; 118 request.notopen = true;
119 request.log = log; 119 request.log = log;
120 request.on_destroy = on_destroy_request; 120 request.on_destroy = on_destroy_request;
121 121
122 local stream = new_xmpp_stream(request, stream_callbacks); 122 local stream = new_xmpp_stream(request, stream_callbacks);
123
123 -- stream:feed() calls the stream_callbacks, so all stanzas in 124 -- stream:feed() calls the stream_callbacks, so all stanzas in
124 -- the body are processed in this next line before it returns. 125 -- the body are processed in this next line before it returns.
126 -- In particular, the streamopened() stream callback is where
127 -- much of the session logic happens, because it's where we first
128 -- get to see the 'sid' of this request.
125 stream:feed(body); 129 stream:feed(body);
126 130
131 -- Stanzas (if any) in the request have now been processed, and
132 -- we take care of the high-level BOSH logic here, including
133 -- giving a response or putting the request "on hold".
127 local session = sessions[request.sid]; 134 local session = sessions[request.sid];
128 if session then 135 if session then
129 -- Session was marked as inactive, since we have 136 -- Session was marked as inactive, since we have
130 -- a request open now, unmark it 137 -- a request open now, unmark it
131 if inactive_sessions[session] and #session.requests > 0 then 138 if inactive_sessions[session] and #session.requests > 0 then
216 sessions[session.sid] = nil; 223 sessions[session.sid] = nil;
217 inactive_sessions[session] = nil; 224 inactive_sessions[session] = nil;
218 sm_destroy_session(session); 225 sm_destroy_session(session);
219 end 226 end
220 227
228 -- Handle the <body> tag in the request payload.
221 function stream_callbacks.streamopened(request, attr) 229 function stream_callbacks.streamopened(request, attr)
222 local sid = attr.sid; 230 local sid = attr.sid;
223 log("debug", "BOSH body open (sid: %s)", sid or "<none>"); 231 log("debug", "BOSH body open (sid: %s)", sid or "<none>");
224 if not sid then 232 if not sid then
225 -- New session request 233 -- New session request
338 return; 346 return;
339 end 347 end
340 session.rid = rid; 348 session.rid = rid;
341 end 349 end
342 350
351 if attr.type == "terminate" then
352 -- Client wants to end this session, which we'll do
353 -- after processing any stanzas in this request
354 session.bosh_terminate = true;
355 end
356
357 request.notopen = nil; -- Signals that we accept this opening tag
358 t_insert(session.requests, request);
359 request.sid = sid;
360
343 if session.notopen then 361 if session.notopen then
344 local features = st.stanza("stream:features"); 362 local features = st.stanza("stream:features");
345 hosts[session.host].events.fire_event("stream-features", { origin = session, features = features }); 363 hosts[session.host].events.fire_event("stream-features", { origin = session, features = features });
346 fire_event("stream-features", session, features); 364 fire_event("stream-features", session, features);
347 session.send(features); 365 session.send(features);
348 session.notopen = nil; 366 session.notopen = nil;
349 end 367 end
350
351 if attr.type == "terminate" then
352 -- Client wants to end this session, which we'll do
353 -- after processing any stanzas in this request
354 session.bosh_terminate = true;
355 end
356
357 request.notopen = nil; -- Signals that we accept this opening tag
358 t_insert(session.requests, request);
359 request.sid = sid;
360 end 368 end
361 369
362 function stream_callbacks.handlestanza(request, stanza) 370 function stream_callbacks.handlestanza(request, stanza)
363 if request.ignore then return; end 371 if request.ignore then return; end
364 log("debug", "BOSH stanza received: %s\n", stanza:top_tag()); 372 log("debug", "BOSH stanza received: %s\n", stanza:top_tag());