Diff

plugins/mod_bosh.lua @ 1663:b30c4d0bbe84

mod_bosh: Basic handling of rids (more to come)
author Matthew Wild <mwild1@gmail.com>
date Tue, 11 Aug 2009 19:52:09 +0100
parent 1662:b31ea419dff5
child 1664:6587b6c2678e
line wrap: on
line diff
--- a/plugins/mod_bosh.lua	Tue Aug 11 19:48:41 2009 +0100
+++ b/plugins/mod_bosh.lua	Tue Aug 11 19:52:09 2009 +0100
@@ -141,7 +141,7 @@
 		
 		-- New session
 		sid = new_uuid();
-		local session = { type = "c2s_unauthed", conn = {}, sid = sid, rid = attr.rid, host = attr.to, bosh_version = attr.ver, bosh_wait = attr.wait, streamid = sid, 
+		local session = { type = "c2s_unauthed", conn = {}, sid = sid, rid = tonumber(attr.rid), host = attr.to, bosh_version = attr.ver, bosh_wait = attr.wait, streamid = sid, 
 						bosh_hold = BOSH_DEFAULT_HOLD, bosh_max_inactive = BOSH_DEFAULT_INACTIVITY,
 						requests = { }, send_buffer = {}, reset_stream = bosh_reset_stream, close = bosh_close_stream, 
 						dispatch_stanza = core_process_stanza, log = logger.init("bosh"..sid), secure = request.secure };
@@ -206,6 +206,21 @@
 		return;
 	end
 	
+	if session.rid then
+		local rid = tonumber(attr.rid);
+		if rid - session.rid > 1 then
+			session.log("warn", "rid too large (means a request was lost). Last rid: %d New rid: %s", session.rid, attr.rid);
+		elseif session.rid >= rid then
+			-- Repeated, ignore
+			session.log("debug", "rid repeated (on request %s), ignoring: %d", request.id, session.rid);
+			request.notopen = nil;
+			t_insert(session.requests, request);
+			return;
+		end
+		request.rid = rid;
+		session.rid = rid;
+	end
+	
 	if attr.type == "terminate" then
 		-- Client wants to end this session
 		session:close();