Changeset

4311:d6366294f618

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).
author Matthew Wild <mwild1@gmail.com>
date Fri, 04 Mar 2011 20:27:57 +0000
parents 4310:52ccbf71d062
children 4312:bcdff2b1d3ec
files plugins/mod_bosh.lua
diffstat 1 files changed, 20 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/mod_bosh.lua	Sun Jun 05 11:53:41 2011 +0100
+++ b/plugins/mod_bosh.lua	Fri Mar 04 20:27:57 2011 +0000
@@ -162,7 +162,13 @@
 			end
 		end
 		
-		return true; -- Inform httpserver we shall reply later
+		if session.bosh_terminate then
+			session.log("debug", "Closing session with %d requests open", #session.requests);
+			session:close();
+			return nil;
+		else
+			return true; -- Inform httpserver we shall reply later
+		end
 	end
 end
 
@@ -202,7 +208,6 @@
 
 	local session_close_response = { headers = default_headers, body = tostring(close_reply) };
 
-	--FIXME: Quite sure we shouldn't reply to all requests with the error
 	for _, held_request in ipairs(session.requests) do
 		held_request:send(session_close_response);
 		held_request:destroy();
@@ -255,7 +260,13 @@
 			local oldest_request = r[1];
 			if oldest_request then
 				log("debug", "We have an open request, so sending on that");
-				response.body = t_concat{"<body xmlns='http://jabber.org/protocol/httpbind' sid='", sid, "' xmlns:stream = 'http://etherx.jabber.org/streams'>", tostring(s), "</body>" };
+				response.body = t_concat({
+					"<body xmlns='http://jabber.org/protocol/httpbind' ",
+					session.bosh_terminate and "type='terminate' " or "",
+					"sid='", sid, "' xmlns:stream = 'http://etherx.jabber.org/streams'>",
+					tostring(s),
+					"</body>"
+				});
 				oldest_request:send(response);
 				--log("debug", "Sent");
 				if oldest_request.stayopen then
@@ -327,13 +338,6 @@
 		session.rid = rid;
 	end
 	
-	if attr.type == "terminate" then
-		-- Client wants to end this session
-		session:close();
-		request.notopen = nil;
-		return;
-	end
-	
 	if session.notopen then
 		local features = st.stanza("stream:features");
 		hosts[session.host].events.fire_event("stream-features", { origin = session, features = features });
@@ -342,6 +346,12 @@
 		session.notopen = nil;
 	end
 	
+	if attr.type == "terminate" then
+		-- Client wants to end this session, which we'll do
+		-- after processing any stanzas in this request
+		session.bosh_terminate = true;
+	end
+
 	request.notopen = nil; -- Signals that we accept this opening tag
 	t_insert(session.requests, request);
 	request.sid = sid;