author | Kim Alvefur <zash@zash.se> |
Sat, 02 Nov 2019 19:24:26 +0100 | |
branch | 0.11 |
changeset 10388 | 94c9c574cd8a |
parent 9400 | e09ddd061ec4 |
child 10389 | 62a7042e0771 |
permissions | -rw-r--r-- |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 |
local adns = require "net.adns"; |
9391
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
2 |
local basic = require "net.resolvers.basic"; |
10388
94c9c574cd8a
net.resolvers: Apply IDNA conversion to ascii for DNS lookups (fixes #1426)
Kim Alvefur <zash@zash.se>
parents:
9400
diff
changeset
|
3 |
local idna_to_ascii = require "util.encodings".idna.to_ascii; |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 |
|
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
local methods = {}; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 |
local resolver_mt = { __index = methods }; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
|
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 |
-- Find the next target to connect to, and |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
-- pass it to cb() |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
function methods:next(cb) |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
if self.targets then |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 |
if #self.targets == 0 then |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
cb(nil); |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 |
return; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
local next_target = table.remove(self.targets, 1); |
9391
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
17 |
self.resolver = basic.new(unpack(next_target, 1, 4)); |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
18 |
self.resolver:next(function (...) |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
19 |
if ... == nil then |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
20 |
self:next(cb); |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
21 |
else |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
22 |
cb(...); |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
23 |
end |
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
24 |
end); |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 |
return; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 |
|
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 |
local targets = {}; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 |
local function ready() |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 |
self.targets = targets; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 |
self:next(cb); |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 |
|
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 |
-- Resolve DNS to target list |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 |
local dns_resolver = adns.resolver(); |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 |
dns_resolver:lookup(function (answer) |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 |
if answer then |
9396
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9395
diff
changeset
|
38 |
if #answer == 0 then |
9397
bcd94cc355d3
net.resolvers.service: Add support for fallback to bare domain and default port
Kim Alvefur <zash@zash.se>
parents:
9396
diff
changeset
|
39 |
if self.extra and self.extra.default_port then |
9398
794eda565c69
net.resolvers.service: Rename internal variable since net.connect uses it for __tostring
Kim Alvefur <zash@zash.se>
parents:
9397
diff
changeset
|
40 |
table.insert(targets, { self.hostname, self.extra.default_port, self.conn_type, self.extra }); |
9397
bcd94cc355d3
net.resolvers.service: Add support for fallback to bare domain and default port
Kim Alvefur <zash@zash.se>
parents:
9396
diff
changeset
|
41 |
end |
9396
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9395
diff
changeset
|
42 |
ready(); |
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9395
diff
changeset
|
43 |
return; |
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9395
diff
changeset
|
44 |
end |
e2733f504d9e
net.resolvers.service: Early return on empty result set
Kim Alvefur <zash@zash.se>
parents:
9395
diff
changeset
|
45 |
|
9395
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9391
diff
changeset
|
46 |
if #answer == 1 and answer[1].srv.target == "." then -- No service here |
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9391
diff
changeset
|
47 |
ready(); |
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9391
diff
changeset
|
48 |
return; |
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9391
diff
changeset
|
49 |
end |
f2d71e4284b7
net.resolvers.service: Understand when service is explicitly unavailable
Kim Alvefur <zash@zash.se>
parents:
9391
diff
changeset
|
50 |
|
9400
e09ddd061ec4
net.resolvers.service: Sort SRV records in correct direction
Kim Alvefur <zash@zash.se>
parents:
9399
diff
changeset
|
51 |
table.sort(answer, function (a, b) return a.srv.priority < b.srv.priority end); |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 |
for _, record in ipairs(answer) do |
9391
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
53 |
table.insert(targets, { record.srv.target, record.srv.port, self.conn_type, self.extra }); |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 |
ready(); |
9398
794eda565c69
net.resolvers.service: Rename internal variable since net.connect uses it for __tostring
Kim Alvefur <zash@zash.se>
parents:
9397
diff
changeset
|
57 |
end, "_" .. self.service .. "._" .. self.conn_type .. "." .. self.hostname, "SRV", "IN"); |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 |
|
9398
794eda565c69
net.resolvers.service: Rename internal variable since net.connect uses it for __tostring
Kim Alvefur <zash@zash.se>
parents:
9397
diff
changeset
|
60 |
local function new(hostname, service, conn_type, extra) |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 |
return setmetatable({ |
10388
94c9c574cd8a
net.resolvers: Apply IDNA conversion to ascii for DNS lookups (fixes #1426)
Kim Alvefur <zash@zash.se>
parents:
9400
diff
changeset
|
62 |
hostname = idna_to_ascii(hostname); |
9391
a5d11627ce5d
net.resolvers.service: net.connect resolver that uses SRV records
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
63 |
service = service; |
8534
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 |
conn_type = conn_type or "tcp"; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 |
extra = extra; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 |
}, resolver_mt); |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 |
end |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 |
|
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 |
return { |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 |
new = new; |
601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 |
}; |