multiplex_listener: Initial commit. Multiple protocols on a single port.

Thu, 10 Dec 2009 05:04:09 +0500

author
Waqas Hussain <waqas20@gmail.com>
date
Thu, 10 Dec 2009 05:04:09 +0500
changeset 2351
f8d002090cea
parent 2350
443e388988e7
child 2352
a7ef564271a5

multiplex_listener: Initial commit. Multiple protocols on a single port.

net/multiplex_listener.lua file | annotate | diff | comparison | revisions
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/net/multiplex_listener.lua	Thu Dec 10 05:04:09 2009 +0500
@@ -0,0 +1,46 @@
+
+local connlisteners_register = require "net.connlisteners".register;
+local connlisteners_get = require "net.connlisteners".get;
+
+local httpserver_listener = connlisteners_get("httpserver");
+local xmppserver_listener = connlisteners_get("xmppserver");
+local xmppclient_listener = connlisteners_get("xmppclient");
+local xmppcomponent_listener = connlisteners_get("xmppcomponent");
+
+local server = { default_mode = "*a" };
+
+local buffer = {};
+
+function server.onincoming(conn, data)
+	if not data then return; end
+	local buf = buffer[conn];
+	buffer[conn] = nil;
+	buf = buf and buf..data or data;
+	if buf:match("^[a-zA-Z]") then
+		local listener = httpserver_listener;
+		conn:setlistener(listener);
+		listener.onincoming(conn, buf);
+	elseif buf:match(">") then
+		local listener;
+		local xmlns = buf:match("%sxmlns%s*=%s*['\"]([^'\"]*)");
+		if xmlns == "jabber:server" then
+			listener = xmppserver_listener;
+		elseif xmlns == "jabber:component:accept" then
+			listener = xmppcomponent_listener;
+		else
+			listener = xmppclient_listener;
+		end
+		conn:setlistener(listener);
+		listener.onincoming(conn, buf);
+	elseif #buf > 1024 then
+		conn:close();
+	else
+		buffer[conn] = buf;
+	end
+end
+
+function server.ondisconnect(conn, err)
+	buffer[conn] = nil; -- warn if no buffer?
+end
+
+connlisteners_register("multiplex", server);

mercurial