Annotate

plugins/mod_net_multiplex.lua @ 10626:26fb44b61a17

net.resolvers.basic: Fix continuing if IPv6 or Legacy IP is disabled The code expects ready() to be called twice, but with IPv4 or v6 disabled it would only be called once.
author Kim Alvefur <zash@zash.se>
date Sun, 26 Jan 2020 14:35:35 +0100
parent 10475:fa0cad7c89e3
child 11023:a59b37b03eca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 module:set_global();
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
10465
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
3 local array = require "util.array";
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local max_buffer_len = module:get_option_number("multiplex_buffer_size", 1024);
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local portmanager = require "core.portmanager";
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local available_services = {};
10465
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
9 local service_by_protocol = {};
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
10 local available_protocols = array();
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local function add_service(service)
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local multiplex_pattern = service.multiplex and service.multiplex.pattern;
10465
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
14 local protocol_name = service.multiplex and service.multiplex.protocol;
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
15 if protocol_name then
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
16 module:log("debug", "Adding multiplex service %q with protocol %q", service.name, protocol_name);
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
17 service_by_protocol[protocol_name] = service;
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
18 available_protocols:push(protocol_name);
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
19 end
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 if multiplex_pattern then
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 module:log("debug", "Adding multiplex service %q with pattern %q", service.name, multiplex_pattern);
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 available_services[service] = multiplex_pattern;
10465
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
23 elseif not protocol_name then
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 module:log("debug", "Service %q is not multiplex-capable", service.name);
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 module:hook("service-added", function (event) add_service(event.service); end);
10465
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
28 module:hook("service-removed", function (event)
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
29 available_services[event.service] = nil;
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
30 if event.service.multiplex and event.service.multiplex.protocol then
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
31 available_protocols:filter(function (p) return p ~= event.service.multiplex.protocol end);
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
32 service_by_protocol[event.service.multiplex.protocol] = nil;
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
33 end
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
34 end);
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35
9465
876171084ea3 mod_net_multiplex: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 7807
diff changeset
36 for _, services in pairs(portmanager.get_registered_services()) do
7502
021d2b844c51 mod_net_multiplex: remove unused one-letter loop variable [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 6380
diff changeset
37 for _, service in ipairs(services) do
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 add_service(service);
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local buffers = {};
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 local listener = { default_mode = "*a" };
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45
10465
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
46 function listener.onconnect(conn)
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
47 local sock = conn:socket();
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
48 if sock.getalpn then
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
49 local selected_proto = sock:getalpn();
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
50 local service = service_by_protocol[selected_proto];
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
51 if service then
10466
276f62d14437 mod_net_multiplex: Tweak debug logging for ALPN case
Kim Alvefur <zash@zash.se>
parents: 10465
diff changeset
52 module:log("debug", "Routing incoming connection to %s based on ALPN %q", service.name, selected_proto);
10465
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
53 local next_listener = service.listener;
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
54 conn:setlistener(next_listener);
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
55 local onconnect = next_listener.onconnect;
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
56 if onconnect then return onconnect(conn) end
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
57 end
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
58 end
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 function listener.onincoming(conn, data)
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 if not data then return; end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 local buf = buffers[conn];
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 buf = buf and buf..data or data;
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 for service, multiplex_pattern in pairs(available_services) do
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 if buf:match(multiplex_pattern) then
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 module:log("debug", "Routing incoming connection to %s", service.name);
9465
876171084ea3 mod_net_multiplex: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 7807
diff changeset
68 local next_listener = service.listener;
876171084ea3 mod_net_multiplex: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 7807
diff changeset
69 conn:setlistener(next_listener);
876171084ea3 mod_net_multiplex: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 7807
diff changeset
70 local onconnect = next_listener.onconnect;
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 if onconnect then onconnect(conn) end
9465
876171084ea3 mod_net_multiplex: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 7807
diff changeset
72 return next_listener.onincoming(conn, buf);
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 if #buf > max_buffer_len then -- Give up
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 conn:close();
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 else
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 buffers[conn] = buf;
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81
9465
876171084ea3 mod_net_multiplex: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 7807
diff changeset
82 function listener.ondisconnect(conn)
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 buffers[conn] = nil; -- warn if no buffer?
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 end
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85
6380
4220ffb87b22 net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents: 5120
diff changeset
86 listener.ondetach = listener.ondisconnect;
4220ffb87b22 net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents: 5120
diff changeset
87
5120
bcabea740c00 mod_{admin_telnet,c2s,component,http,net_multiplex,s2s}: Use module:provides() instead of module:add_item().
Waqas Hussain <waqas20@gmail.com>
parents: 4619
diff changeset
88 module:provides("net", {
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 name = "multiplex";
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 config_prefix = "";
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 listener = listener;
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 });
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 module:provides("net", {
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 name = "multiplex_ssl";
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 config_prefix = "ssl";
7806
00bca79ae778 mod_net_multiplex: Enable SSL on the SSL port (fixes #803)
Kim Alvefur <zash@zash.se>
parents: 6380
diff changeset
97 encryption = "ssl";
10465
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
98 ssl_config = {
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
99 alpn = function ()
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
100 return available_protocols;
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
101 end;
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 9465
diff changeset
102 };
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
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 listener = listener;
d5739b8b7161 mod_net_multiplex: Port multiplexing (run multiple different services on a the same port(s))... now pluggable for use with any net plugin
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 });