Annotate

net/resolvers/basic.lua @ 13014:06453c564141

util.startup: Add prosody.started promise to easily execute code after startup To avoid a race where server-started fires before the promise function body is run (on next tick), I moved server-started to fire on the next tick, which seems sensible anyway. Errors are logged, I'm not sure if we ought to be doing something more here. I'm sure we'll find out.
author Matthew Wild <mwild1@gmail.com>
date Sat, 01 Apr 2023 11:56:38 +0100
parent 12974:ba409c67353b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12974
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12815
diff changeset
1 local adns = require "prosody.net.adns";
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12815
diff changeset
2 local inet_pton = require "prosody.util.net".pton;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12815
diff changeset
3 local inet_ntop = require "prosody.util.net".ntop;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12815
diff changeset
4 local idna_to_ascii = require "prosody.util.encodings".idna.to_ascii;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12815
diff changeset
5 local promise = require "prosody.util.promise";
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12815
diff changeset
6 local t_move = require "prosody.util.table".move;
8531
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 local methods = {};
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 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
10
10485
913276ba0c47 net.connect: Mention RFC 6724 regression
Kim Alvefur <zash@zash.se>
parents: 10484
diff changeset
11 -- FIXME RFC 6724
10484
b13a31cea7d9 net.connect: Add some TODOs and FIXMEs
Kim Alvefur <zash@zash.se>
parents: 10441
diff changeset
12
12601
72f7bb3f30d3 net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents: 12413
diff changeset
13 local function do_dns_lookup(self, dns_resolver, record_type, name, allow_insecure)
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
14 return promise.new(function (resolve, reject)
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
15 local ipv = (record_type == "A" and "4") or (record_type == "AAAA" and "6") or nil;
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
16 if ipv and self.extra["use_ipv"..ipv] == false then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
17 return reject(("IPv%s disabled - %s lookup skipped"):format(ipv, record_type));
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
18 elseif record_type == "TLSA" and self.extra.use_dane ~= true then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
19 return reject("DANE disabled - TLSA lookup skipped");
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
20 end
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
21 dns_resolver:lookup(function (answer, err)
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
22 if not answer then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
23 return reject(err);
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
24 elseif answer.bogus then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
25 return reject(("Validation error in %s lookup"):format(record_type));
12601
72f7bb3f30d3 net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents: 12413
diff changeset
26 elseif not (answer.secure or allow_insecure) then
72f7bb3f30d3 net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents: 12413
diff changeset
27 return reject(("Insecure response in %s lookup"):format(record_type));
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
28 elseif answer.status and #answer == 0 then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
29 return reject(("%s in %s lookup"):format(answer.status, record_type));
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
30 end
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
31
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
32 local targets = { secure = answer.secure };
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
33 for _, record in ipairs(answer) do
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
34 if ipv then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
35 table.insert(targets, { self.conn_type..ipv, record[record_type:lower()], self.port, self.extra });
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
36 else
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
37 table.insert(targets, record[record_type:lower()]);
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
38 end
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
39 end
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
40 return resolve(targets);
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
41 end, name, record_type, "IN");
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
42 end);
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
43 end
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
44
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
45 local function merge_targets(ipv4_targets, ipv6_targets)
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
46 local result = { secure = ipv4_targets.secure and ipv6_targets.secure };
12409
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
47 local common_length = math.min(#ipv4_targets, #ipv6_targets);
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
48 for i = 1, common_length do
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
49 table.insert(result, ipv6_targets[i]);
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
50 table.insert(result, ipv4_targets[i]);
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
51 end
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
52 if common_length < #ipv4_targets then
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
53 t_move(ipv4_targets, common_length+1, #ipv4_targets, common_length+1, result);
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
54 elseif common_length < #ipv6_targets then
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
55 t_move(ipv6_targets, common_length+1, #ipv6_targets, common_length+1, result);
9f0baf15e792 net.resolvers.basic: Alternate IP address family targets, per RFC 8305
Matthew Wild <mwild1@gmail.com>
parents: 12408
diff changeset
56 end
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
57 return result;
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
58 end
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
59
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 -- 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
61 -- pass it to cb()
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 function methods:next(cb)
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 if self.targets then
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 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
65 cb(nil);
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 return;
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 local next_target = table.remove(self.targets, 1);
12410
596625eed326 net.resolvers.basic: Indicate to callback if we have more targets available
Matthew Wild <mwild1@gmail.com>
parents: 12409
diff changeset
69 cb(next_target[1], next_target[2], next_target[3], next_target[4], not not self.targets[1]);
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 return;
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 end
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72
10385
62a7042e0771 net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents: 10384
diff changeset
73 if not self.hostname then
12025
6ed7fd28f5e3 net.resolvers: Report when hostname fails IDNA
Kim Alvefur <zash@zash.se>
parents: 11901
diff changeset
74 self.last_error = "hostname failed IDNA";
10385
62a7042e0771 net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents: 10384
diff changeset
75 cb(nil);
10400
4c2d789a106b net.resolvers: Fix traceback from hostname failing IDNA
Kim Alvefur <zash@zash.se>
parents: 10385
diff changeset
76 return;
10385
62a7042e0771 net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents: 10384
diff changeset
77 end
62a7042e0771 net.resolvers: Abort on hostnames not passing IDNA validation
Kim Alvefur <zash@zash.se>
parents: 10384
diff changeset
78
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
79 -- Resolve DNS to target list
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
80 local dns_resolver = adns.resolver();
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
81
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
82 local dns_lookups = {
12601
72f7bb3f30d3 net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents: 12413
diff changeset
83 ipv4 = do_dns_lookup(self, dns_resolver, "A", self.hostname, true);
72f7bb3f30d3 net.resolvers.basic: Add opt-out argument for DNSSEC security status
Kim Alvefur <zash@zash.se>
parents: 12413
diff changeset
84 ipv6 = do_dns_lookup(self, dns_resolver, "AAAA", self.hostname, true);
12413
e155f4509954 net.resolvers.basic: Fix incorrect field name (thanks CI)
Matthew Wild <mwild1@gmail.com>
parents: 12410
diff changeset
85 tlsa = do_dns_lookup(self, dns_resolver, "TLSA", ("_%d._%s.%s"):format(self.port, self.conn_type, self.hostname));
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
86 };
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
87
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
88 promise.all_settled(dns_lookups):next(function (dns_results)
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
89 -- Combine targets, assign to self.targets, self:next(cb)
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
90 local have_ipv4 = dns_results.ipv4.status == "fulfilled";
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
91 local have_ipv6 = dns_results.ipv6.status == "fulfilled";
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
92
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
93 if have_ipv4 and have_ipv6 then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
94 self.targets = merge_targets(dns_results.ipv4.value, dns_results.ipv6.value);
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
95 elseif have_ipv4 then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
96 self.targets = dns_results.ipv4.value;
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
97 elseif have_ipv6 then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
98 self.targets = dns_results.ipv6.value;
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
99 else
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
100 self.targets = {};
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
101 end
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
102
11414
5a71f14ab77c net.connect: Add DANE support
Kim Alvefur <zash@zash.se>
parents: 11008
diff changeset
103 if self.extra and self.extra.use_dane then
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
104 if self.targets.secure and dns_results.tlsa.status == "fulfilled" then
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
105 self.extra.tlsa = dns_results.tlsa.value;
11708
5ef729c355f3 Revert 926d53af9a7a: Restore DANE support
Kim Alvefur <zash@zash.se>
parents: 11430
diff changeset
106 self.extra.dane_hostname = self.hostname;
5ef729c355f3 Revert 926d53af9a7a: Restore DANE support
Kim Alvefur <zash@zash.se>
parents: 11430
diff changeset
107 else
5ef729c355f3 Revert 926d53af9a7a: Restore DANE support
Kim Alvefur <zash@zash.se>
parents: 11430
diff changeset
108 self.extra.tlsa = nil;
5ef729c355f3 Revert 926d53af9a7a: Restore DANE support
Kim Alvefur <zash@zash.se>
parents: 11430
diff changeset
109 self.extra.dane_hostname = nil;
11414
5a71f14ab77c net.connect: Add DANE support
Kim Alvefur <zash@zash.se>
parents: 11008
diff changeset
110 end
12815
2d134201dc55 net.resolvers.basic: Record hostname coming from secure SRV records
Kim Alvefur <zash@zash.se>
parents: 12601
diff changeset
111 elseif self.extra and self.extra.srv_secure then
2d134201dc55 net.resolvers.basic: Record hostname coming from secure SRV records
Kim Alvefur <zash@zash.se>
parents: 12601
diff changeset
112 self.extra.secure_hostname = self.hostname;
11414
5a71f14ab77c net.connect: Add DANE support
Kim Alvefur <zash@zash.se>
parents: 11008
diff changeset
113 end
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
114
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 self:next(cb);
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
116 end):catch(function (err)
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
117 self.last_error = err;
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
118 self.targets = {};
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
119 end);
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 end
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 local function new(hostname, port, conn_type, extra)
10436
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
123 local ascii_host = idna_to_ascii(hostname);
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
124 local targets = nil;
11007
1d8e1f7a587c net.resolvers.basic: Default conn_type to 'tcp' consistently if unspecified (thanks marc0s)
Matthew Wild <mwild1@gmail.com>
parents: 10439
diff changeset
125 conn_type = conn_type or "tcp";
10436
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
126
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
127 local is_ip = inet_pton(hostname);
10437
fcfc8f4d14a8 net.resolvers.basic: Fix resolution of IPv6 literals (in brackets) (fixes #1459)
Kim Alvefur <zash@zash.se>
parents: 10436
diff changeset
128 if not is_ip and hostname:sub(1,1) == '[' then
fcfc8f4d14a8 net.resolvers.basic: Fix resolution of IPv6 literals (in brackets) (fixes #1459)
Kim Alvefur <zash@zash.se>
parents: 10436
diff changeset
129 is_ip = inet_pton(hostname:sub(2,-2));
fcfc8f4d14a8 net.resolvers.basic: Fix resolution of IPv6 literals (in brackets) (fixes #1459)
Kim Alvefur <zash@zash.se>
parents: 10436
diff changeset
130 end
10436
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
131 if is_ip then
10439
97c0f5fe5f41 net.resolvers.basic: Normalise IP literals, ensures net.server is happy
Kim Alvefur <zash@zash.se>
parents: 10437
diff changeset
132 hostname = inet_ntop(is_ip);
10436
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
133 if #is_ip == 16 then
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
134 targets = { { conn_type.."6", hostname, port, extra } };
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
135 elseif #is_ip == 4 then
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
136 targets = { { conn_type.."4", hostname, port, extra } };
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
137 end
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
138 end
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
139
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 return setmetatable({
10436
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
141 hostname = ascii_host;
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 port = port;
11007
1d8e1f7a587c net.resolvers.basic: Default conn_type to 'tcp' consistently if unspecified (thanks marc0s)
Matthew Wild <mwild1@gmail.com>
parents: 10439
diff changeset
143 conn_type = conn_type;
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
144 extra = extra or {};
10436
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
145 targets = targets;
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 }, resolver_mt);
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 end
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 return {
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 new = new;
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 };