Software /
code /
prosody
Comparison
plugins/mod_net_multiplex.lua @ 4619:d5739b8b7161
mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 15 Mar 2012 03:05:02 +0000 |
child | 5120:bcabea740c00 |
comparison
equal
deleted
inserted
replaced
4618:1ec8122ddffe | 4619:d5739b8b7161 |
---|---|
1 module:set_global(); | |
2 | |
3 local max_buffer_len = module:get_option_number("multiplex_buffer_size", 1024); | |
4 | |
5 local portmanager = require "core.portmanager"; | |
6 | |
7 local available_services = {}; | |
8 | |
9 local function add_service(service) | |
10 local multiplex_pattern = service.multiplex and service.multiplex.pattern; | |
11 if multiplex_pattern then | |
12 module:log("debug", "Adding multiplex service %q with pattern %q", service.name, multiplex_pattern); | |
13 available_services[service] = multiplex_pattern; | |
14 else | |
15 module:log("debug", "Service %q is not multiplex-capable", service.name); | |
16 end | |
17 end | |
18 module:hook("service-added", function (event) add_service(event.service); end); | |
19 module:hook("service-removed", function (event) available_services[event.service] = nil; end); | |
20 | |
21 for service_name, services in pairs(portmanager.get_registered_services()) do | |
22 for i, service in ipairs(services) do | |
23 add_service(service); | |
24 end | |
25 end | |
26 | |
27 local buffers = {}; | |
28 | |
29 local listener = { default_mode = "*a" }; | |
30 | |
31 function listener.onconnect() | |
32 end | |
33 | |
34 function listener.onincoming(conn, data) | |
35 if not data then return; end | |
36 local buf = buffers[conn]; | |
37 buffers[conn] = nil; | |
38 buf = buf and buf..data or data; | |
39 for service, multiplex_pattern in pairs(available_services) do | |
40 if buf:match(multiplex_pattern) then | |
41 module:log("debug", "Routing incoming connection to %s", service.name); | |
42 local listener = service.listener; | |
43 conn:setlistener(listener); | |
44 local onconnect = listener.onconnect; | |
45 if onconnect then onconnect(conn) end | |
46 return listener.onincoming(conn, buf); | |
47 end | |
48 end | |
49 if #buf > max_buffer_len then -- Give up | |
50 conn:close(); | |
51 else | |
52 buffers[conn] = buf; | |
53 end | |
54 end | |
55 | |
56 function listener.ondisconnect(conn, err) | |
57 buffers[conn] = nil; -- warn if no buffer? | |
58 end | |
59 | |
60 module:add_item("net-provider", { | |
61 name = "multiplex"; | |
62 config_prefix = ""; | |
63 listener = listener; | |
64 }); | |
65 | |
66 module:provides("net", { | |
67 name = "multiplex_ssl"; | |
68 config_prefix = "ssl"; | |
69 listener = listener; | |
70 }); |