Diff

core/s2smanager.lua @ 1007:c500d4cb7855

core.s2smanager: Buffer data sent before connection
author Matthew Wild <mwild1@gmail.com>
date Mon, 20 Apr 2009 22:14:31 +0100
parent 1006:9166d7a8c3c0
child 1075:831c84cbf5fa
line wrap: on
line diff
--- a/core/s2smanager.lua	Mon Apr 20 22:13:09 2009 +0100
+++ b/core/s2smanager.lua	Mon Apr 20 22:14:31 2009 +0100
@@ -141,6 +141,23 @@
 		
 		attempt_connection(host_session);
 		
+		if not host_session.sends2s then		
+			-- A sends2s which buffers data (until the stream is opened)
+			-- note that data in this buffer will be sent before the stream is authed
+			-- and will not be ack'd in any way, successful or otherwise
+			local buffer;
+			function host_session.sends2s(data)
+				if not buffer then
+					buffer = {};
+					host_session.send_buffer = buffer;
+				end
+				log("debug", "Buffering data on unconnected s2sout to %s", to_host);
+				buffer[#buffer+1] = data;
+				log("debug", "Buffered item %d: %s", #buffer, tostring(data));
+			end
+			
+		end
+
 		return host_session;
 end
 
@@ -263,6 +280,20 @@
 		if not attr.id then error("stream response did not give us a streamid!!!"); end
 		session.streamid = attr.id;
 	
+		-- Send unauthed buffer
+		-- (stanzas which are fine to send before dialback)
+		-- Note that this is *not* the stanza queue (which 
+		-- we can only send if auth succeeds) :)
+		local send_buffer = session.send_buffer;
+		if send_buffer and #send_buffer > 0 then
+			log("debug", "Sending s2s send_buffer now...");
+			for i, data in ipairs(send_buffer) do
+				session.sends2s(tostring(data));
+				send_buffer[i] = nil;
+			end
+		end
+		session.send_buffer = nil;
+	
 		if not session.dialback_verifying then
 			initiate_dialback(session);
 		else