Software /
code /
prosody
Comparison
net/multiplex_listener.lua @ 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 |
child | 3137:463d51ee9a2b |
comparison
equal
deleted
inserted
replaced
2350:443e388988e7 | 2351:f8d002090cea |
---|---|
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 listener.onincoming(conn, buf); | |
23 elseif buf:match(">") then | |
24 local listener; | |
25 local xmlns = buf:match("%sxmlns%s*=%s*['\"]([^'\"]*)"); | |
26 if xmlns == "jabber:server" then | |
27 listener = xmppserver_listener; | |
28 elseif xmlns == "jabber:component:accept" then | |
29 listener = xmppcomponent_listener; | |
30 else | |
31 listener = xmppclient_listener; | |
32 end | |
33 conn:setlistener(listener); | |
34 listener.onincoming(conn, buf); | |
35 elseif #buf > 1024 then | |
36 conn:close(); | |
37 else | |
38 buffer[conn] = buf; | |
39 end | |
40 end | |
41 | |
42 function server.ondisconnect(conn, err) | |
43 buffer[conn] = nil; -- warn if no buffer? | |
44 end | |
45 | |
46 connlisteners_register("multiplex", server); |