Software /
code /
prosody
Comparison
core/s2smanager.lua @ 1204:dea89234e545
s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 26 May 2009 21:59:28 +0100 |
parent | 1199:db2a55fe94f2 |
child | 1308:7b20a3d87244 |
comparison
equal
deleted
inserted
replaced
1203:23725bfdeed5 | 1204:dea89234e545 |
---|---|
9 | 9 |
10 | 10 |
11 local hosts = hosts; | 11 local hosts = hosts; |
12 local sessions = sessions; | 12 local sessions = sessions; |
13 local core_process_stanza = function(a, b) core_process_stanza(a, b); end | 13 local core_process_stanza = function(a, b) core_process_stanza(a, b); end |
14 local add_task = require "util.timer".add_task; | |
14 local socket = require "socket"; | 15 local socket = require "socket"; |
15 local format = string.format; | 16 local format = string.format; |
16 local t_insert, t_sort = table.insert, table.sort; | 17 local t_insert, t_sort = table.insert, table.sort; |
17 local get_traceback = debug.traceback; | 18 local get_traceback = debug.traceback; |
18 local tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber | 19 local tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber |
35 local sha256_hash = require "util.hashes".sha256; | 36 local sha256_hash = require "util.hashes".sha256; |
36 | 37 |
37 local dialback_secret = sha256_hash(tostring{} .. math.random() .. socket.gettime(), true); | 38 local dialback_secret = sha256_hash(tostring{} .. math.random() .. socket.gettime(), true); |
38 | 39 |
39 local adns = require "net.adns"; | 40 local adns = require "net.adns"; |
41 | |
42 local dns_timeout = config.get("*", "core", "dns_timeout") or 60; | |
40 | 43 |
41 incoming_s2s = {}; | 44 incoming_s2s = {}; |
42 local incoming_s2s = incoming_s2s; | 45 local incoming_s2s = incoming_s2s; |
43 | 46 |
44 module "s2smanager" | 47 module "s2smanager" |
167 local connect_host, connect_port = idna_to_ascii(to_host), 5269; | 170 local connect_host, connect_port = idna_to_ascii(to_host), 5269; |
168 | 171 |
169 if not err then -- This is our first attempt | 172 if not err then -- This is our first attempt |
170 log("debug", "First attempt to connect to %s, starting with SRV lookup...", to_host); | 173 log("debug", "First attempt to connect to %s, starting with SRV lookup...", to_host); |
171 host_session.connecting = true; | 174 host_session.connecting = true; |
172 local answer = | 175 local answer, handle; |
173 adns.lookup(function (answer) | 176 handle = adns.lookup(function (answer) |
177 handle = nil; | |
174 host_session.connecting = nil; | 178 host_session.connecting = nil; |
175 if answer then | 179 if answer then |
176 log("debug", to_host.." has SRV records, handling..."); | 180 log("debug", to_host.." has SRV records, handling..."); |
177 local srv_hosts = {}; | 181 local srv_hosts = {}; |
178 host_session.srv_hosts = srv_hosts; | 182 host_session.srv_hosts = srv_hosts; |
191 log("debug", to_host.." has no SRV records, falling back to A"); | 195 log("debug", to_host.." has no SRV records, falling back to A"); |
192 end | 196 end |
193 -- Try with SRV, or just the plain hostname if no SRV | 197 -- Try with SRV, or just the plain hostname if no SRV |
194 return try_connect(host_session, connect_host, connect_port); | 198 return try_connect(host_session, connect_host, connect_port); |
195 end, "_xmpp-server._tcp."..connect_host..".", "SRV"); | 199 end, "_xmpp-server._tcp."..connect_host..".", "SRV"); |
200 | |
201 -- Set handler for DNS timeout | |
202 add_task(dns_timeout, function () | |
203 if handle then | |
204 adns.cancel(handle, true); | |
205 end | |
206 end); | |
207 | |
196 log("debug", "DNS lookup for %s sent, waiting for response before we can connect", to_host); | 208 log("debug", "DNS lookup for %s sent, waiting for response before we can connect", to_host); |
197 return true; -- Attempt in progress | 209 return true; -- Attempt in progress |
198 elseif host_session.srv_hosts and #host_session.srv_hosts > host_session.srv_choice then -- Not our first attempt, and we also have SRV | 210 elseif host_session.srv_hosts and #host_session.srv_hosts > host_session.srv_choice then -- Not our first attempt, and we also have SRV |
199 host_session.srv_choice = host_session.srv_choice + 1; | 211 host_session.srv_choice = host_session.srv_choice + 1; |
200 local srv_choice = host_session.srv_hosts[host_session.srv_choice]; | 212 local srv_choice = host_session.srv_hosts[host_session.srv_choice]; |