net.xmppcomponent_listener: Removed unnecessary and problematic cleanup code.
[prosody.git] / net / multiplex_listener.lua
1
2 local connlisteners_register = require "net.connlisteners".register;
3 local connlisteners_get = require "net.connlisteners".get;
4
5 local httpserver_listener = connlisteners_get("httpserver");
6 local xmppserver_listener = connlisteners_get("xmppserver");
7 local xmppclient_listener = connlisteners_get("xmppclient");
8 local xmppcomponent_listener = connlisteners_get("xmppcomponent");
9
10 local server = { default_mode = "*a" };
11
12 local buffer = {};
13
14 function server.onincoming(conn, data)
15         if not data then return; end
16         local buf = buffer[conn];
17         buffer[conn] = nil;
18         buf = buf and buf..data or data;
19         if buf:match("^[a-zA-Z]") then
20                 local listener = httpserver_listener;
21                 conn:setlistener(listener);
22                 local onconnect = listener.onconnect;
23                 if onconnect then onconnect(conn) end
24                 listener.onincoming(conn, buf);
25         elseif buf:match(">") then
26                 local listener;
27                 local xmlns = buf:match("%sxmlns%s*=%s*['\"]([^'\"]*)");
28                 if xmlns == "jabber:server" then
29                         listener = xmppserver_listener;
30                 elseif xmlns == "jabber:component:accept" then
31                         listener = xmppcomponent_listener;
32                 else
33                         listener = xmppclient_listener;
34                 end
35                 conn:setlistener(listener);
36                 local onconnect = listener.onconnect;
37                 if onconnect then onconnect(conn) end
38                 listener.onincoming(conn, buf);
39         elseif #buf > 1024 then
40                 conn:close();
41         else
42                 buffer[conn] = buf;
43         end
44 end
45
46 function server.ondisconnect(conn, err)
47         buffer[conn] = nil; -- warn if no buffer?
48 end
49
50 connlisteners_register("multiplex", server);