Software /
code /
prosody
Comparison
net/connect.lua @ 12412:18a3a6218100
net.connect: When more targets are immediately available, try them after a delay
RFC 8305
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 18 Mar 2022 16:16:57 +0000 |
parent | 12411:e132a4279914 |
child | 12425:eabcc3ae22e9 |
comparison
equal
deleted
inserted
replaced
12411:e132a4279914 | 12412:18a3a6218100 |
---|---|
1 local server = require "net.server"; | 1 local server = require "net.server"; |
2 local log = require "util.logger".init("net.connect"); | 2 local log = require "util.logger".init("net.connect"); |
3 local new_id = require "util.id".short; | 3 local new_id = require "util.id".short; |
4 local timer = require "util.timer"; | |
4 | 5 |
5 -- TODO #1246 Happy Eyeballs | 6 -- TODO #1246 Happy Eyeballs |
6 -- FIXME RFC 6724 | 7 -- FIXME RFC 6724 |
7 -- FIXME Error propagation from resolvers doesn't work | 8 -- FIXME Error propagation from resolvers doesn't work |
8 -- FIXME #1428 Reuse DNS resolver object between service and basic resolver | 9 -- FIXME #1428 Reuse DNS resolver object between service and basic resolver |
26 | 27 |
27 local pending_connection_listeners = {}; | 28 local pending_connection_listeners = {}; |
28 | 29 |
29 local function attempt_connection(p) | 30 local function attempt_connection(p) |
30 p:log("debug", "Checking for targets..."); | 31 p:log("debug", "Checking for targets..."); |
31 p.target_resolver:next(function (conn_type, ip, port, extra) | 32 p.target_resolver:next(function (conn_type, ip, port, extra, more_targets_available) |
32 if not conn_type then | 33 if not conn_type then |
33 -- No more targets to try | 34 -- No more targets to try |
34 p:log("debug", "No more connection targets to try", p.target_resolver.last_error); | 35 p:log("debug", "No more connection targets to try", p.target_resolver.last_error); |
35 if p.listeners.onfail then | 36 if p.listeners.onfail then |
36 p.listeners.onfail(p.data, p.last_error or p.target_resolver.last_error or "unable to resolve service"); | 37 p.listeners.onfail(p.data, p.last_error or p.target_resolver.last_error or "unable to resolve service"); |
45 p.last_error = err or "unknown reason"; | 46 p.last_error = err or "unknown reason"; |
46 return attempt_connection(p); | 47 return attempt_connection(p); |
47 end | 48 end |
48 p.conns[conn] = true; | 49 p.conns[conn] = true; |
49 pending_connections_map[conn] = p; | 50 pending_connections_map[conn] = p; |
51 if more_targets_available then | |
52 timer.add_task(0.250, function () | |
53 if not p.connected then | |
54 p:log("debug", "Still not connected, making parallel connection attempt..."); | |
55 attempt_connection(p); | |
56 end | |
57 end); | |
58 end | |
50 end); | 59 end); |
51 end | 60 end |
52 | 61 |
53 function pending_connection_listeners.onconnect(conn) | 62 function pending_connection_listeners.onconnect(conn) |
54 local p = pending_connections_map[conn]; | 63 local p = pending_connections_map[conn]; |