author | Matthew Wild <mwild1@gmail.com> |
Tue, 05 Apr 2011 14:34:48 +0100 | |
changeset 4241 | 49b9e73e31ef |
parent 3138 | d6151c9a6f7e |
permissions | -rw-r--r-- |
2351
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
1 |
|
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
2 |
local connlisteners_register = require "net.connlisteners".register; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
3 |
local connlisteners_get = require "net.connlisteners".get; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
4 |
|
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
5 |
local httpserver_listener = connlisteners_get("httpserver"); |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
6 |
local xmppserver_listener = connlisteners_get("xmppserver"); |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
7 |
local xmppclient_listener = connlisteners_get("xmppclient"); |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
8 |
local xmppcomponent_listener = connlisteners_get("xmppcomponent"); |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
9 |
|
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
10 |
local server = { default_mode = "*a" }; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
11 |
|
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
12 |
local buffer = {}; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
13 |
|
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
14 |
function server.onincoming(conn, data) |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
15 |
if not data then return; end |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
16 |
local buf = buffer[conn]; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
17 |
buffer[conn] = nil; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
18 |
buf = buf and buf..data or data; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
19 |
if buf:match("^[a-zA-Z]") then |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
20 |
local listener = httpserver_listener; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
21 |
conn:setlistener(listener); |
3138
d6151c9a6f7e
net.multiplex_listener: Test to make sure listener.onconnect isn't nil.
Waqas Hussain <waqas20@gmail.com>
parents:
3137
diff
changeset
|
22 |
local onconnect = listener.onconnect; |
d6151c9a6f7e
net.multiplex_listener: Test to make sure listener.onconnect isn't nil.
Waqas Hussain <waqas20@gmail.com>
parents:
3137
diff
changeset
|
23 |
if onconnect then onconnect(conn) end |
2351
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
24 |
listener.onincoming(conn, buf); |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
25 |
elseif buf:match(">") then |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
26 |
local listener; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
27 |
local xmlns = buf:match("%sxmlns%s*=%s*['\"]([^'\"]*)"); |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
28 |
if xmlns == "jabber:server" then |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
29 |
listener = xmppserver_listener; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
30 |
elseif xmlns == "jabber:component:accept" then |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
31 |
listener = xmppcomponent_listener; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
32 |
else |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
33 |
listener = xmppclient_listener; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
34 |
end |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
35 |
conn:setlistener(listener); |
3138
d6151c9a6f7e
net.multiplex_listener: Test to make sure listener.onconnect isn't nil.
Waqas Hussain <waqas20@gmail.com>
parents:
3137
diff
changeset
|
36 |
local onconnect = listener.onconnect; |
d6151c9a6f7e
net.multiplex_listener: Test to make sure listener.onconnect isn't nil.
Waqas Hussain <waqas20@gmail.com>
parents:
3137
diff
changeset
|
37 |
if onconnect then onconnect(conn) end |
2351
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
38 |
listener.onincoming(conn, buf); |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
39 |
elseif #buf > 1024 then |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
40 |
conn:close(); |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
41 |
else |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
42 |
buffer[conn] = buf; |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
43 |
end |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
44 |
end |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
45 |
|
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
46 |
function server.ondisconnect(conn, err) |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
47 |
buffer[conn] = nil; -- warn if no buffer? |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
48 |
end |
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
49 |
|
f8d002090cea
multiplex_listener: Initial commit. Multiple protocols on a single port.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
50 |
connlisteners_register("multiplex", server); |