Mercurial > prosody-hg
comparison net/resolvers/basic.lua @ 8531:601681acea73
net.connect: New API for outgoing connections, based on 'service resolvers'
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 23 Feb 2018 15:53:45 +0000 |
| parents | |
| children | ae7cf011e46a |
comparison
equal
deleted
inserted
replaced
| 8530:075df839c110 | 8531:601681acea73 |
|---|---|
| 1 local adns = require "net.adns"; | |
| 2 | |
| 3 local methods = {}; | |
| 4 local resolver_mt = { __index = methods }; | |
| 5 | |
| 6 -- Find the next target to connect to, and | |
| 7 -- pass it to cb() | |
| 8 function methods:next(cb) | |
| 9 if self.targets then | |
| 10 if #self.targets == 0 then | |
| 11 cb(nil); | |
| 12 return; | |
| 13 end | |
| 14 local next_target = table.remove(self.targets, 1); | |
| 15 cb(unpack(next_target, 1, 4)); | |
| 16 return; | |
| 17 end | |
| 18 | |
| 19 local targets = {}; | |
| 20 local n = 2; | |
| 21 local function ready() | |
| 22 n = n - 1; | |
| 23 if n > 0 then return; end | |
| 24 self.targets = targets; | |
| 25 self:next(cb); | |
| 26 end | |
| 27 | |
| 28 -- Resolve DNS to target list | |
| 29 local dns_resolver = adns.resolver(); | |
| 30 dns_resolver:lookup(function (answer) | |
| 31 if answer then | |
| 32 for _, record in ipairs(answer) do | |
| 33 table.insert(targets, { self.conn_type, record.a, self.port, self.extra }); | |
| 34 end | |
| 35 end | |
| 36 ready(); | |
| 37 end, self.hostname, "A", "IN"); | |
| 38 | |
| 39 dns_resolver:lookup(function (answer) | |
| 40 if answer then | |
| 41 for _, record in ipairs(answer) do | |
| 42 table.insert(targets, { self.conn_type.."6", record.aaaa, self.port, self.extra }); | |
| 43 end | |
| 44 end | |
| 45 ready(); | |
| 46 end, self.hostname, "AAAA", "IN"); | |
| 47 end | |
| 48 | |
| 49 local function new(hostname, port, conn_type, extra) | |
| 50 return setmetatable({ | |
| 51 hostname = hostname; | |
| 52 port = port; | |
| 53 conn_type = conn_type or "tcp"; | |
| 54 extra = extra; | |
| 55 }, resolver_mt); | |
| 56 end | |
| 57 | |
| 58 return { | |
| 59 new = new; | |
| 60 }; |
