diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/multiplex_listener.lua | 46 |
1 files changed, 46 insertions, 0 deletions
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); |