Annotate

net/resolvers/basic.lua @ 12601:72f7bb3f30d3

net.resolvers.basic: Add opt-out argument for DNSSEC security status This makes explicit which lookups can accept an unsigned response. Insecure (unsigned, as before DNSSEC) A and AAAA records can be used as security would come from TLS, but an insecure TLSA record is worthless.
author Kim Alvefur <zash@zash.se>
date Tue, 02 Aug 2022 16:08:43 +0200
parent 12413:e155f4509954
child 12815:2d134201dc55
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8531
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";
8775
ae7cf011e46a net.resolvers.basic: Support IP address literals
Kim Alvefur <zash@zash.se>
parents: 8531
diff changeset
2 local inet_pton = require "util.net".pton;
10439
97c0f5fe5f41 net.resolvers.basic: Normalise IP literals, ensures net.server is happy
Kim Alvefur <zash@zash.se>
parents: 10437
diff changeset
3 local inet_ntop = require "util.net".ntop;
10384
94c9c574cd8a net.resolvers: Apply IDNA conversion to ascii for DNS lookups (fixes #1426)
Kim Alvefur <zash@zash.se>
parents: 9496
diff changeset
4 local idna_to_ascii = require "util.encodings".idna.to_ascii;
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
5 local promise = require "util.promise";
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
6 local t_move = require "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
5a71f14ab77c net.connect: Add DANE support
Kim Alvefur <zash@zash.se>
parents: 11008
diff changeset
111 end
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
112
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 self:next(cb);
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
114 end):catch(function (err)
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
115 self.last_error = err;
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
116 self.targets = {};
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
117 end);
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 end
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 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
121 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
122 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
123 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
124
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
125 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
126 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
127 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
128 end
10436
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
129 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
130 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
131 if #is_ip == 16 then
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
132 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
133 elseif #is_ip == 4 then
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
134 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
135 end
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
136 end
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
137
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 return setmetatable({
10436
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
139 hostname = ascii_host;
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 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
141 conn_type = conn_type;
12408
acfc51b9530c net.resolvers.basic: Refactor to remove code duplication
Matthew Wild <mwild1@gmail.com>
parents: 12129
diff changeset
142 extra = extra or {};
10436
0d702ec77f0c net.resolvers.basic: Move IP literal check to constructor
Kim Alvefur <zash@zash.se>
parents: 10400
diff changeset
143 targets = targets;
8531
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 }, resolver_mt);
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 end
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 return {
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 new = new;
601681acea73 net.connect: New API for outgoing connections, based on 'service resolvers'
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 };