Merge from waqas

Mon, 22 Dec 2008 13:29:59 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 22 Dec 2008 13:29:59 +0000
changeset 632
8f3db0bd2bb4
parent 630
e9336adb66e5 (diff)
parent 631
6957fe7b0313 (current diff)
child 633
fe1e01a06729

Merge from waqas

--- a/core/sessionmanager.lua	Fri Dec 19 01:57:13 2008 +0500
+++ b/core/sessionmanager.lua	Mon Dec 22 13:29:59 2008 +0000
@@ -113,8 +113,6 @@
 	if session.resource then return nil, "cancel", "already-bound", "Cannot bind multiple resources on a single connection"; end
 	-- We don't support binding multiple resources
 
-	session.conntimetotal = gettime()-session.conntime;
-	
 	resource = resource or uuid_generate();
 	--FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing
 	
--- a/core/xmlhandlers.lua	Fri Dec 19 01:57:13 2008 +0500
+++ b/core/xmlhandlers.lua	Mon Dec 22 13:29:59 2008 +0000
@@ -47,29 +47,27 @@
 
 function init_xmlhandlers(session, stream_callbacks)
 		local ns_stack = { "" };
-		local curr_ns = "";
+		local curr_ns, name = "";
 		local curr_tag;
 		local chardata = {};
 		local xml_handlers = {};
 		local log = session.log or default_log;
-
-		local send = session.send;
 		
 		local cb_streamopened = stream_callbacks.streamopened;
 		local cb_streamclosed = stream_callbacks.streamclosed;
 		local cb_error = stream_callbacks.error or function (session, e) error("XML stream error: "..tostring(e)); end;
 		local cb_handlestanza = stream_callbacks.handlestanza;
 		
-		local stream_ns = stream_callbacks.ns;
+		local stream_tag = stream_callbacks.stream_tag;
 		
 		local stanza
-		function xml_handlers:StartElement(name, attr)
+		function xml_handlers:StartElement(tagname, attr)
 			if stanza and #chardata > 0 then
 				-- We have some character data in the buffer
 				stanza:text(t_concat(chardata));
 				chardata = {};
 			end
-			curr_ns,name = name:match("^(.+)|([%w%-]+)$");
+			local curr_ns,name = tagname:match("^(.+)|([%w%-]+)$");
 			if curr_ns ~= "jabber:server" then
 				attr.xmlns = curr_ns;
 			end
@@ -91,7 +89,7 @@
 			
 			if not stanza then --if we are not currently inside a stanza
 				if session.notopen then
-					if name == "stream" and curr_ns == stream_ns then
+					if tagname == stream_tag then
 						if cb_streamopened then
 							cb_streamopened(session, attr);
 						end
@@ -120,10 +118,10 @@
 				t_insert(chardata, data);
 			end
 		end
-		function xml_handlers:EndElement(name)
-			curr_ns,name = name:match("^(.+)|([%w%-]+)$");
+		function xml_handlers:EndElement(tagname)
+			curr_ns,name = tagname:match("^(.+)|([%w%-]+)$");
 			if (not stanza) or (#stanza.last_add > 0 and name ~= stanza.last_add[#stanza.last_add].name) then 
-				if name == "stream" then
+				if tagname == stream_tag then
 					if cb_streamclosed then
 						cb_streamclosed(session);
 					end
--- a/net/connlisteners.lua	Fri Dec 19 01:57:13 2008 +0500
+++ b/net/connlisteners.lua	Mon Dec 22 13:29:59 2008 +0000
@@ -47,7 +47,8 @@
 function get(name)
 	local h = listeners[name];
 	if not h then
-		pcall(dofile, listeners_dir..name:gsub("[^%w%-]", "_").."_listener.lua");
+		local ok, ret = pcall(dofile, listeners_dir..name:gsub("[^%w%-]", "_").."_listener.lua");
+		if not ok then return nil, ret; end
 		h = listeners[name];
 	end
 	return h;
--- a/net/server.lua	Fri Dec 19 01:57:13 2008 +0500
+++ b/net/server.lua	Mon Dec 22 13:29:59 2008 +0000
@@ -37,6 +37,7 @@
 local coroutine_yield = coroutine.yield
 local print = print;
 local out_put = function () end --print;
+local out_put = print;
 local out_error = print;
 
 --// extern libs //--
@@ -100,6 +101,8 @@
 
 	local wrapclient, err
 
+	out_put("Starting a new server on "..tostring(serverport).." with ssl: "..tostring(sslctx));
+	
 	if sslctx then
 		if not ssl_newcontext then
 			return nil, "luasec not found"
@@ -188,7 +191,7 @@
 
 	local writequeue = { }    -- buffer for messages to send
 
-	local eol, fatal_send_error   -- end of buffer
+	local eol, fatal_send_error, wants_closing
 
 	local sstat, rstat = 0, 0
 
@@ -223,7 +226,17 @@
 		--return shutdown( socket, pattern )
 	end
 	handler.close = function( closed )
-		if eol and not fatal_send_error then handler._dispatchdata(); end
+		if eol and not fatal_send_error then
+			-- There is data in the buffer, and we haven't experienced
+			-- an error trying to send yet, so we'll flush the buffer now
+			handler._dispatchdata();
+			if eol then
+				-- and there is *still* data in the buffer
+				-- we'll give up for now, and close later
+				wants_closing = true;
+				return;
+			end
+		end
 		close( socket )
 		writelen = ( eol and removesocket( writelist, socket, writelen ) ) or writelen
 		readlen = removesocket( readlist, socket, readlen )
@@ -287,6 +300,9 @@
 			--writequeue = { }
 			eol = nil
 			writelen = removesocket( writelist, socket, writelen )    -- delete socket from writelist
+			if wants_closing then
+				handler.close();
+			end
 			return true
 		elseif byte and ( err == "timeout" or err == "wantwrite" ) then    -- want write
 			buffer = string_sub( buffer, byte + 1, -1 )    -- new buffer
@@ -368,7 +384,7 @@
 
 	local writequeue = { }    -- buffer for messages to send
 
-	local eol, fatal_send_error   -- end of buffer
+	local eol, fatal_send_error, wants_closing
 
 	local sstat, rstat = 0, 0
 
@@ -403,7 +419,17 @@
 		--return shutdown( socket, pattern )
 	end
 	handler.close = function( closed )
-		if eol and not fatal_send_error then handler._dispatchdata(); end
+		if eol and not fatal_send_error then
+			-- There is data in the buffer, and we haven't experienced
+			-- an error trying to send yet, so we'll flush the buffer now
+			handler._dispatchdata();
+			if eol then
+				-- and there is *still* data in the buffer
+				-- we'll give up for now, and close later
+				wants_closing = true;
+				return;
+			end
+		end
 		close( socket )
 		writelen = ( eol and removesocket( writelist, socket, writelen ) ) or writelen
 		readlen = removesocket( readlist, socket, readlen )
@@ -471,6 +497,9 @@
 				out_put("server.lua: connection is ready for tls handshake");
 				handler.starttls(true);
 			end
+			if wants_closing then
+				handler.close();
+			end
 			return true
 		elseif byte and ( err == "timeout" or err == "wantwrite" ) then    -- want write
 			buffer = string_sub( buffer, byte + 1, -1 )    -- new buffer
@@ -585,7 +614,7 @@
 
 	local writequeue = { }    -- list for messages to send
 
-	local eol, fatal_send_error
+	local eol, fatal_send_error, wants_closing
 
 	socket:settimeout(0);
 	
@@ -622,7 +651,17 @@
 		return shutdown( socket, pattern )
 	end
 	handler.close = function( closed )
-		if eol and not fatal_send_error then handler.dispatchdata(); end
+		if eol and not fatal_send_error then
+			-- There is data in the buffer, and we haven't experienced
+			-- an error trying to send yet, so we'll flush the buffer now
+			handler.dispatchdata();
+			if eol then
+				-- and there is *still* data in the buffer
+				-- we'll give up for now, and close later
+				wants_closing = true;
+				return;
+			end
+		end
 		_ = not closed and shutdown( socket )
 		_ = not closed and close( socket )
 		writelen = ( eol and removesocket( writelist, socket, writelen ) ) or writelen
@@ -688,6 +727,9 @@
 			--writequeue = { }
 			eol = nil
 			writelen = removesocket( writelist, socket, writelen )    -- delete socket from writelist
+			if wants_closing then
+				handler.close();
+			end
 			return true
 		elseif byte and ( err == "timeout" or err == "wantwrite" ) then    -- want write
 			buffer = string_sub( buffer, byte + 1, -1 )    -- new buffer
--- a/net/xmppclient_listener.lua	Fri Dec 19 01:57:13 2008 +0500
+++ b/net/xmppclient_listener.lua	Mon Dec 22 13:29:59 2008 +0000
@@ -36,7 +36,7 @@
 local sm_streamclosed = sessionmanager.streamclosed;
 local st = stanza;
 
-local stream_callbacks = { ns = "http://etherx.jabber.org/streams", streamopened = sm_streamopened, streamclosed = sm_streamclosed, handlestanza = core_process_stanza };
+local stream_callbacks = { stream_tag = "http://etherx.jabber.org/streams|stream", streamopened = sm_streamopened, streamclosed = sm_streamclosed, handlestanza = core_process_stanza };
 
 function stream_callbacks.error(session, error, data)
 	if error == "no-stream" then
--- a/net/xmppserver_listener.lua	Fri Dec 19 01:57:13 2008 +0500
+++ b/net/xmppserver_listener.lua	Mon Dec 22 13:29:59 2008 +0000
@@ -28,7 +28,7 @@
 local s2s_streamclosed = require "core.s2smanager".streamclosed;
 local s2s_destroy_session = require "core.s2smanager".destroy_session;
 local s2s_attempt_connect = require "core.s2smanager".attempt_connection;
-local stream_callbacks = { ns = "http://etherx.jabber.org/streams", streamopened = s2s_streamopened, streamclosed = s2s_streamclosed, handlestanza =  core_process_stanza };
+local stream_callbacks = { stream_tag = "http://etherx.jabber.org/streams|stream", streamopened = s2s_streamopened, streamclosed = s2s_streamclosed, handlestanza =  core_process_stanza };
 
 function stream_callbacks.error(session, error, data)
 	if error == "no-stream" then
--- a/plugins/mod_tls.lua	Fri Dec 19 01:57:13 2008 +0500
+++ b/plugins/mod_tls.lua	Mon Dec 22 13:29:59 2008 +0000
@@ -33,8 +33,6 @@
 		function (session, stanza)
 			if session.conn.starttls then
 				session.send(st.stanza("proceed", { xmlns = xmlns_starttls }));
-				-- FIXME: I'm commenting the below, not sure why it was necessary
-				-- sessions[session.conn] = nil;
 				session:reset_stream();
 				session.conn.starttls();
 				session.log("info", "TLS negotiation started...");
--- a/util/stanza.lua	Fri Dec 19 01:57:13 2008 +0500
+++ b/util/stanza.lua	Mon Dec 22 13:29:59 2008 +0000
@@ -19,6 +19,7 @@
 
 
 local t_insert      =  table.insert;
+local t_concat      =  table.concat;
 local t_remove      =  table.remove;
 local t_concat      =  table.concat;
 local s_format      = string.format;

mercurial