From 005e186fc8839b231b593a1cb98526009d57d62f Mon Sep 17 00:00:00 2001
From: Waqas Hussain <waqas20@gmail.com>
Date: Thu, 10 Dec 2009 05:04:09 +0500
Subject: multiplex_listener: Initial commit. Multiple protocols on a single
 port.

---
 net/multiplex_listener.lua | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)
 create mode 100644 net/multiplex_listener.lua

(limited to 'net')

diff --git a/net/multiplex_listener.lua b/net/multiplex_listener.lua
new file mode 100644
index 00000000..bf193ad8
--- /dev/null
+++ b/net/multiplex_listener.lua
@@ -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);
-- 
cgit v1.2.3