comparison plugins/mod_net_multiplex.lua @ 10563:e8db377a2983

Merge 0.11->trunk
author Kim Alvefur <zash@zash.se>
date Tue, 24 Dec 2019 00:39:45 +0100
parents fa0cad7c89e3
children a59b37b03eca
comparison
equal deleted inserted replaced
10562:670afc079f68 10563:e8db377a2983
1 module:set_global(); 1 module:set_global();
2 2
3 local array = require "util.array";
3 local max_buffer_len = module:get_option_number("multiplex_buffer_size", 1024); 4 local max_buffer_len = module:get_option_number("multiplex_buffer_size", 1024);
4 5
5 local portmanager = require "core.portmanager"; 6 local portmanager = require "core.portmanager";
6 7
7 local available_services = {}; 8 local available_services = {};
9 local service_by_protocol = {};
10 local available_protocols = array();
8 11
9 local function add_service(service) 12 local function add_service(service)
10 local multiplex_pattern = service.multiplex and service.multiplex.pattern; 13 local multiplex_pattern = service.multiplex and service.multiplex.pattern;
14 local protocol_name = service.multiplex and service.multiplex.protocol;
15 if protocol_name then
16 module:log("debug", "Adding multiplex service %q with protocol %q", service.name, protocol_name);
17 service_by_protocol[protocol_name] = service;
18 available_protocols:push(protocol_name);
19 end
11 if multiplex_pattern then 20 if multiplex_pattern then
12 module:log("debug", "Adding multiplex service %q with pattern %q", service.name, multiplex_pattern); 21 module:log("debug", "Adding multiplex service %q with pattern %q", service.name, multiplex_pattern);
13 available_services[service] = multiplex_pattern; 22 available_services[service] = multiplex_pattern;
14 else 23 elseif not protocol_name then
15 module:log("debug", "Service %q is not multiplex-capable", service.name); 24 module:log("debug", "Service %q is not multiplex-capable", service.name);
16 end 25 end
17 end 26 end
18 module:hook("service-added", function (event) add_service(event.service); end); 27 module:hook("service-added", function (event) add_service(event.service); end);
19 module:hook("service-removed", function (event) available_services[event.service] = nil; end); 28 module:hook("service-removed", function (event)
29 available_services[event.service] = nil;
30 if event.service.multiplex and event.service.multiplex.protocol then
31 available_protocols:filter(function (p) return p ~= event.service.multiplex.protocol end);
32 service_by_protocol[event.service.multiplex.protocol] = nil;
33 end
34 end);
20 35
21 for _, services in pairs(portmanager.get_registered_services()) do 36 for _, services in pairs(portmanager.get_registered_services()) do
22 for _, service in ipairs(services) do 37 for _, service in ipairs(services) do
23 add_service(service); 38 add_service(service);
24 end 39 end
26 41
27 local buffers = {}; 42 local buffers = {};
28 43
29 local listener = { default_mode = "*a" }; 44 local listener = { default_mode = "*a" };
30 45
31 function listener.onconnect() 46 function listener.onconnect(conn)
47 local sock = conn:socket();
48 if sock.getalpn then
49 local selected_proto = sock:getalpn();
50 local service = service_by_protocol[selected_proto];
51 if service then
52 module:log("debug", "Routing incoming connection to %s based on ALPN %q", service.name, selected_proto);
53 local next_listener = service.listener;
54 conn:setlistener(next_listener);
55 local onconnect = next_listener.onconnect;
56 if onconnect then return onconnect(conn) end
57 end
58 end
32 end 59 end
33 60
34 function listener.onincoming(conn, data) 61 function listener.onincoming(conn, data)
35 if not data then return; end 62 if not data then return; end
36 local buf = buffers[conn]; 63 local buf = buffers[conn];
66 93
67 module:provides("net", { 94 module:provides("net", {
68 name = "multiplex_ssl"; 95 name = "multiplex_ssl";
69 config_prefix = "ssl"; 96 config_prefix = "ssl";
70 encryption = "ssl"; 97 encryption = "ssl";
98 ssl_config = {
99 alpn = function ()
100 return available_protocols;
101 end;
102 };
71 listener = listener; 103 listener = listener;
72 }); 104 });