mod_bosh: Basic handling of rids (more to come)
authorMatthew Wild <mwild1@gmail.com>
Tue, 11 Aug 2009 18:52:09 +0000 (19:52 +0100)
committerMatthew Wild <mwild1@gmail.com>
Tue, 11 Aug 2009 18:52:09 +0000 (19:52 +0100)
plugins/mod_bosh.lua

index 1e3fd7ae6360238d3a3081164fca85c1e464834a..d8eb94e7ecec1dcdbe737798073cf7277989acbd 100644 (file)
@@ -141,7 +141,7 @@ function stream_callbacks.streamopened(request, attr)
                
                -- 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 @@ function stream_callbacks.streamopened(request, attr)
                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();