Software /
code /
prosody
Changeset
2351:f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Thu, 10 Dec 2009 05:04:09 +0500 |
parents | 2350:443e388988e7 |
children | 2352:a7ef564271a5 |
files | net/multiplex_listener.lua |
diffstat | 1 files changed, 46 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /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);