plugins/mod_s2s/s2sout.lib.lua
author Kim Alvefur <zash@zash.se>
Wed, 14 Aug 2013 14:44:56 +0200
changeset 5799 4a7e90b4c97d
parent 5798 c610b5fb53f3
child 5859 e327f2d4e09f
permissions -rw-r--r--
mod_s2s: Lower "Beginning new connection attempt" message from info to debug level
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
-- Prosody IM
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
     4
--
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
-- COPYING file in the source package for more information.
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
--
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
--- Module containing all the logic for connecting to a remote server
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
4602
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
    11
local portmanager = require "core.portmanager";
4569
34b1122126f6 s2sout.lib: import utils/functionality once in s2smanager.
Florian Zeitz <florob@babelmonkeys.de>
parents: 4555
diff changeset
    12
local wrapclient = require "net.server".wrapclient;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
local initialize_filters = require "util.filters".initialize;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
local idna_to_ascii = require "util.encodings".idna.to_ascii;
4569
34b1122126f6 s2sout.lib: import utils/functionality once in s2smanager.
Florian Zeitz <florob@babelmonkeys.de>
parents: 4555
diff changeset
    15
local new_ip = require "util.ip".new_ip;
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 5388
diff changeset
    16
local rfc6724_dest = require "util.rfc6724".destination;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
local socket = require "socket";
4756
f8ddaaa08a8e mod_s2s/s2sout.lib: Fix imports and some undefined variables
Matthew Wild <mwild1@gmail.com>
parents: 4629
diff changeset
    18
local adns = require "net.adns";
f8ddaaa08a8e mod_s2s/s2sout.lib: Fix imports and some undefined variables
Matthew Wild <mwild1@gmail.com>
parents: 4629
diff changeset
    19
local dns = require "net.dns";
4573
09255a10fdfa Merge Zash with Florob and Maranda
Matthew Wild <mwild1@gmail.com>
parents: 4564 4570
diff changeset
    20
local t_insert, t_sort, ipairs = table.insert, table.sort, ipairs;
5701
746b263e09cf mod_s2s/s2sout.lib: Use new util.net.local_addresses() to fetch local interface addresses
Matthew Wild <mwild1@gmail.com>
parents: 5700
diff changeset
    21
local local_addresses = require "util.net".local_addresses;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
local s2s_destroy_session = require "core.s2smanager".destroy_session;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
4756
f8ddaaa08a8e mod_s2s/s2sout.lib: Fix imports and some undefined variables
Matthew Wild <mwild1@gmail.com>
parents: 4629
diff changeset
    25
local log = module._log;
f8ddaaa08a8e mod_s2s/s2sout.lib: Fix imports and some undefined variables
Matthew Wild <mwild1@gmail.com>
parents: 4629
diff changeset
    26
4602
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
    27
local sources = {};
4922
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
    28
local has_ipv4, has_ipv6;
4569
34b1122126f6 s2sout.lib: import utils/functionality once in s2smanager.
Florian Zeitz <florob@babelmonkeys.de>
parents: 4555
diff changeset
    29
4832
6b3aec1e0d9f s2smanager, mod_s2s: Move checking DNS timeout option to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
    30
local dns_timeout = module:get_option_number("dns_timeout", 15);
6b3aec1e0d9f s2smanager, mod_s2s: Move checking DNS timeout option to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
    31
dns.settimeout(dns_timeout);
4599
f9f5230d7a9c s2smanager, mod_s2s: Move import of dns_max_depth to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 4573
diff changeset
    32
local max_dns_depth = module:get_option_number("dns_max_depth", 3);
f9f5230d7a9c s2smanager, mod_s2s: Move import of dns_max_depth to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 4573
diff changeset
    33
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
local s2sout = {};
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
local s2s_listener;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
4563
75bff73391fb s2sout.lib: Add locals for source interfaces
Kim Alvefur <zash@zash.se>
parents: 4562
diff changeset
    38
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
function s2sout.set_listener(listener)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
	s2s_listener = listener;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
local function compare_srv_priorities(a,b)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
	return a.priority < b.priority or (a.priority == b.priority and a.weight > b.weight);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
function s2sout.initiate_connection(host_session)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
	initialize_filters(host_session);
5351
901ed253bbf7 mod_s2s, mod_saslauth, mod_compression: Refactor to have common code for opening streams
Kim Alvefur <zash@zash.se>
parents: 5112
diff changeset
    49
	host_session.version = 1;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
    50
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
	-- Kick the connection attempting machine into life
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
	if not s2sout.attempt_connection(host_session) then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
		-- Intentionally not returning here, the
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
		-- session is needed, connected or not
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
		s2s_destroy_session(host_session);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
    57
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
	if not host_session.sends2s then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
		-- A sends2s which buffers data (until the stream is opened)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
		-- note that data in this buffer will be sent before the stream is authed
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
		-- and will not be ack'd in any way, successful or otherwise
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
		local buffer;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
		function host_session.sends2s(data)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
			if not buffer then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
				buffer = {};
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
				host_session.send_buffer = buffer;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
			end
4756
f8ddaaa08a8e mod_s2s/s2sout.lib: Fix imports and some undefined variables
Matthew Wild <mwild1@gmail.com>
parents: 4629
diff changeset
    68
			log("debug", "Buffering data on unconnected s2sout to %s", tostring(host_session.to_host));
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
			buffer[#buffer+1] = data;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
			log("debug", "Buffered item %d: %s", #buffer, tostring(data));
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
		end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
	end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
function s2sout.attempt_connection(host_session, err)
5703
ea00fc524b95 mod_s2s/s2sout.lib: Remove unused variables and imports
Matthew Wild <mwild1@gmail.com>
parents: 5702
diff changeset
    76
	local to_host = host_session.to_host;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    77
	local connect_host, connect_port = to_host and idna_to_ascii(to_host), 5269;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
    78
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
	if not connect_host then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
		return false;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
    82
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
	if not err then -- This is our first attempt
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
		log("debug", "First attempt to connect to %s, starting with SRV lookup...", to_host);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
		host_session.connecting = true;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
		local handle;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    87
		handle = adns.lookup(function (answer)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
			handle = nil;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
			host_session.connecting = nil;
5112
8b94a8d92cf3 mod_s2s: Check that an SRV reply isn't empty.
Kim Alvefur <zash@zash.se>
parents: 4987
diff changeset
    90
			if answer and #answer > 0 then
4987
d37f2abac72c mod_s2s/s2sout.lib: Use %s to insert strings into log messages instead of concatenation
Matthew Wild <mwild1@gmail.com>
parents: 4959
diff changeset
    91
				log("debug", "%s has SRV records, handling...", to_host);
5386
43059357b2f0 mod_s2s: Keep the dns answer object around a while so plugins can look at it
Kim Alvefur <zash@zash.se>
parents: 5351
diff changeset
    92
				local srv_hosts = { answer = answer };
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
				host_session.srv_hosts = srv_hosts;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
				for _, record in ipairs(answer) do
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    95
					t_insert(srv_hosts, record.srv);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    96
				end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    97
				if #srv_hosts == 1 and srv_hosts[1].target == "." then
4987
d37f2abac72c mod_s2s/s2sout.lib: Use %s to insert strings into log messages instead of concatenation
Matthew Wild <mwild1@gmail.com>
parents: 4959
diff changeset
    98
					log("debug", "%s does not provide a XMPP service", to_host);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    99
					s2s_destroy_session(host_session, err); -- Nothing to see here
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
					return;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
				end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   102
				t_sort(srv_hosts, compare_srv_priorities);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   103
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   104
				local srv_choice = srv_hosts[1];
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   105
				host_session.srv_choice = 1;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   106
				if srv_choice then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   107
					connect_host, connect_port = srv_choice.target or to_host, srv_choice.port or connect_port;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   108
					log("debug", "Best record found, will connect to %s:%d", connect_host, connect_port);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   109
				end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   110
			else
4987
d37f2abac72c mod_s2s/s2sout.lib: Use %s to insert strings into log messages instead of concatenation
Matthew Wild <mwild1@gmail.com>
parents: 4959
diff changeset
   111
				log("debug", "%s has no SRV records, falling back to A/AAAA", to_host);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   112
			end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   113
			-- Try with SRV, or just the plain hostname if no SRV
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   114
			local ok, err = s2sout.try_connect(host_session, connect_host, connect_port);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   115
			if not ok then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   116
				if not s2sout.attempt_connection(host_session, err) then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   117
					-- No more attempts will be made
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   118
					s2s_destroy_session(host_session, err);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   119
				end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   120
			end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   121
		end, "_xmpp-server._tcp."..connect_host..".", "SRV");
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   122
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   123
		return true; -- Attempt in progress
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   124
	elseif host_session.ip_hosts then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   125
		return s2sout.try_connect(host_session, connect_host, connect_port, err);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   126
	elseif host_session.srv_hosts and #host_session.srv_hosts > host_session.srv_choice then -- Not our first attempt, and we also have SRV
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   127
		host_session.srv_choice = host_session.srv_choice + 1;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   128
		local srv_choice = host_session.srv_hosts[host_session.srv_choice];
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   129
		connect_host, connect_port = srv_choice.target or to_host, srv_choice.port or connect_port;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   130
		host_session.log("info", "Connection failed (%s). Attempt #%d: This time to %s:%d", tostring(err), host_session.srv_choice, connect_host, connect_port);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   131
	else
5798
c610b5fb53f3 mod_s2s/s2sout.lib: Improve error message logged at 'info' level when failing to connect to a host. Now 'Failed in all attempts to connect to XYZ'
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   132
		host_session.log("info", "Failed in all attempts to connect to %s", tostring(host_session.to_host));
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   133
		-- We're out of options
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   134
		return false;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   135
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   136
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   137
	if not (connect_host and connect_port) then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   138
		-- Likely we couldn't resolve DNS
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   139
		log("warn", "Hmm, we're without a host (%s) and port (%s) to connect to for %s, giving up :(", tostring(connect_host), tostring(connect_port), tostring(to_host));
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   140
		return false;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   141
	end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   142
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   143
	return s2sout.try_connect(host_session, connect_host, connect_port);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   144
end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   145
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   146
function s2sout.try_next_ip(host_session)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   147
	host_session.connecting = nil;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   148
	host_session.ip_choice = host_session.ip_choice + 1;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   149
	local ip = host_session.ip_hosts[host_session.ip_choice];
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   150
	local ok, err= s2sout.make_connect(host_session, ip.ip, ip.port);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   151
	if not ok then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   152
		if not s2sout.attempt_connection(host_session, err or "closed") then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   153
			err = err and (": "..err) or "";
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   154
			s2s_destroy_session(host_session, "Connection failed"..err);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   155
		end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   156
	end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   157
end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   158
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   159
function s2sout.try_connect(host_session, connect_host, connect_port, err)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   160
	host_session.connecting = true;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   161
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   162
	if not err then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   163
		local IPs = {};
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   164
		host_session.ip_hosts = IPs;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   165
		local handle4, handle6;
4957
1722a6bea115 mod_s2s/s2sout.lib: Don't wait for both v4 and v6 DNS responses if we only send one (e.g. because v6 is disabled)
Matthew Wild <mwild1@gmail.com>
parents: 4923
diff changeset
   166
		local have_other_result = not(has_ipv4) or not(has_ipv6) or false;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   167
4922
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   168
		if has_ipv4 then
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   169
			handle4 = adns.lookup(function (reply, err)
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   170
				handle4 = nil;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   171
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   172
				-- COMPAT: This is a compromise for all you CNAME-(ab)users :)
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   173
				if not (reply and reply[#reply] and reply[#reply].a) then
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   174
					local count = max_dns_depth;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   175
					reply = dns.peek(connect_host, "CNAME", "IN");
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   176
					while count > 0 and reply and reply[#reply] and not reply[#reply].a and reply[#reply].cname do
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   177
						log("debug", "Looking up %s (DNS depth is %d)", tostring(reply[#reply].cname), count);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   178
						reply = dns.peek(reply[#reply].cname, "A", "IN") or dns.peek(reply[#reply].cname, "CNAME", "IN");
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   179
						count = count - 1;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   180
					end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   181
				end
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   182
				-- end of CNAME resolving
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   183
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   184
				if reply and reply[#reply] and reply[#reply].a then
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   185
					for _, ip in ipairs(reply) do
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   186
						log("debug", "DNS reply for %s gives us %s", connect_host, ip.a);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   187
						IPs[#IPs+1] = new_ip(ip.a, "IPv4");
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   188
					end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   189
				end
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   190
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   191
				if have_other_result then
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   192
					if #IPs > 0 then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 5388
diff changeset
   193
						rfc6724_dest(host_session.ip_hosts, sources);
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   194
						for i = 1, #IPs do
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   195
							IPs[i] = {ip = IPs[i], port = connect_port};
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   196
						end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   197
						host_session.ip_choice = 0;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   198
						s2sout.try_next_ip(host_session);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   199
					else
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   200
						log("debug", "DNS lookup failed to get a response for %s", connect_host);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   201
						host_session.ip_hosts = nil;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   202
						if not s2sout.attempt_connection(host_session, "name resolution failed") then -- Retry if we can
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   203
							log("debug", "No other records to try for %s - destroying", host_session.to_host);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   204
							err = err and (": "..err) or "";
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   205
							s2s_destroy_session(host_session, "DNS resolution failed"..err); -- End of the line, we can't
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   206
						end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   207
					end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   208
				else
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   209
					have_other_result = true;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   210
				end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   211
			end, connect_host, "A", "IN");
4922
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   212
		else
4957
1722a6bea115 mod_s2s/s2sout.lib: Don't wait for both v4 and v6 DNS responses if we only send one (e.g. because v6 is disabled)
Matthew Wild <mwild1@gmail.com>
parents: 4923
diff changeset
   213
			have_other_result = true;
4922
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   214
		end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   215
4922
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   216
		if has_ipv6 then
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   217
			handle6 = adns.lookup(function (reply, err)
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   218
				handle6 = nil;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   219
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   220
				if reply and reply[#reply] and reply[#reply].aaaa then
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   221
					for _, ip in ipairs(reply) do
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   222
						log("debug", "DNS reply for %s gives us %s", connect_host, ip.aaaa);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   223
						IPs[#IPs+1] = new_ip(ip.aaaa, "IPv6");
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   224
					end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   225
				end
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   226
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   227
				if have_other_result then
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   228
					if #IPs > 0 then
5552
40e7a6cf15ff util.rfc{3484,6724}: Update to RFC 6724
Florian Zeitz <florob@babelmonkeys.de>
parents: 5388
diff changeset
   229
						rfc6724_dest(host_session.ip_hosts, sources);
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   230
						for i = 1, #IPs do
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   231
							IPs[i] = {ip = IPs[i], port = connect_port};
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   232
						end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   233
						host_session.ip_choice = 0;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   234
						s2sout.try_next_ip(host_session);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   235
					else
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   236
						log("debug", "DNS lookup failed to get a response for %s", connect_host);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   237
						host_session.ip_hosts = nil;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   238
						if not s2sout.attempt_connection(host_session, "name resolution failed") then -- Retry if we can
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   239
							log("debug", "No other records to try for %s - destroying", host_session.to_host);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   240
							err = err and (": "..err) or "";
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   241
							s2s_destroy_session(host_session, "DNS resolution failed"..err); -- End of the line, we can't
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   242
						end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   243
					end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   244
				else
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   245
					have_other_result = true;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   246
				end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   247
			end, connect_host, "AAAA", "IN");
4922
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   248
		else
4957
1722a6bea115 mod_s2s/s2sout.lib: Don't wait for both v4 and v6 DNS responses if we only send one (e.g. because v6 is disabled)
Matthew Wild <mwild1@gmail.com>
parents: 4923
diff changeset
   249
			have_other_result = true;
4922
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   250
		end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   251
		return true;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   252
	elseif host_session.ip_hosts and #host_session.ip_hosts > host_session.ip_choice then -- Not our first attempt, and we also have IPs left to try
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   253
		s2sout.try_next_ip(host_session);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   254
	else
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   255
		host_session.ip_hosts = nil;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   256
		if not s2sout.attempt_connection(host_session, "out of IP addresses") then -- Retry if we can
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   257
			log("debug", "No other records to try for %s - destroying", host_session.to_host);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   258
			err = err and (": "..err) or "";
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   259
			s2s_destroy_session(host_session, "Connecting failed"..err); -- End of the line, we can't
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   260
			return false;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   261
		end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   262
	end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   263
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   264
	return true;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   265
end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   266
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   267
function s2sout.make_connect(host_session, connect_host, connect_port)
5799
4a7e90b4c97d mod_s2s: Lower "Beginning new connection attempt" message from info to debug level
Kim Alvefur <zash@zash.se>
parents: 5798
diff changeset
   268
	(host_session.log or log)("debug", "Beginning new connection attempt to %s ([%s]:%d)", host_session.to_host, connect_host.addr, connect_port);
5703
ea00fc524b95 mod_s2s/s2sout.lib: Remove unused variables and imports
Matthew Wild <mwild1@gmail.com>
parents: 5702
diff changeset
   269
5388
f833d2188c16 mod_s2s: Reset secure flag on new connection attempt
Kim Alvefur <zash@zash.se>
parents: 5386
diff changeset
   270
	-- Reset secure flag in case this is another
f833d2188c16 mod_s2s: Reset secure flag on new connection attempt
Kim Alvefur <zash@zash.se>
parents: 5386
diff changeset
   271
	-- connection attempt after a failed STARTTLS
f833d2188c16 mod_s2s: Reset secure flag on new connection attempt
Kim Alvefur <zash@zash.se>
parents: 5386
diff changeset
   272
	host_session.secure = nil;
f833d2188c16 mod_s2s: Reset secure flag on new connection attempt
Kim Alvefur <zash@zash.se>
parents: 5386
diff changeset
   273
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   274
	local conn, handler;
5700
94081567ea9e mod_s2s/s2sout.lib: Only attempt to create an IPv6 socket if LuaSocket supports IPv6
Matthew Wild <mwild1@gmail.com>
parents: 5552
diff changeset
   275
	local proto = connect_host.proto;
94081567ea9e mod_s2s/s2sout.lib: Only attempt to create an IPv6 socket if LuaSocket supports IPv6
Matthew Wild <mwild1@gmail.com>
parents: 5552
diff changeset
   276
	if proto == "IPv4" then
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   277
		conn, handler = socket.tcp();
5700
94081567ea9e mod_s2s/s2sout.lib: Only attempt to create an IPv6 socket if LuaSocket supports IPv6
Matthew Wild <mwild1@gmail.com>
parents: 5552
diff changeset
   278
	elseif proto == "IPv6" and socket.tcp6 then
94081567ea9e mod_s2s/s2sout.lib: Only attempt to create an IPv6 socket if LuaSocket supports IPv6
Matthew Wild <mwild1@gmail.com>
parents: 5552
diff changeset
   279
		conn, handler = socket.tcp6();
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   280
	else
5700
94081567ea9e mod_s2s/s2sout.lib: Only attempt to create an IPv6 socket if LuaSocket supports IPv6
Matthew Wild <mwild1@gmail.com>
parents: 5552
diff changeset
   281
		handler = "Unsupported protocol: "..tostring(proto);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   282
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   283
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   284
	if not conn then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   285
		log("warn", "Failed to create outgoing connection, system error: %s", handler);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   286
		return false, handler;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   287
	end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   288
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   289
	conn:settimeout(0);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   290
	local success, err = conn:connect(connect_host.addr, connect_port);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   291
	if not success and err ~= "timeout" then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   292
		log("warn", "s2s connect() to %s (%s:%d) failed: %s", host_session.to_host, connect_host.addr, connect_port, err);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   293
		return false, err;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   294
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   295
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   296
	conn = wrapclient(conn, connect_host.addr, connect_port, s2s_listener, "*a");
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   297
	host_session.conn = conn;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   298
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   299
	local filter = initialize_filters(host_session);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   300
	local w, log = conn.write, host_session.log;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   301
	host_session.sends2s = function (t)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   302
		log("debug", "sending: %s", (t.top_tag and t:top_tag()) or t:match("^[^>]*>?"));
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   303
		if t.name then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   304
			t = filter("stanzas/out", t);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   305
		end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   306
		if t then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   307
			t = filter("bytes/out", tostring(t));
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   308
			if t then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   309
				return w(conn, tostring(t));
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   310
			end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   311
		end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   312
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   313
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   314
	-- Register this outgoing connection so that xmppserver_listener knows about it
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   315
	-- otherwise it will assume it is a new incoming connection
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   316
	s2s_listener.register_outgoing(conn, host_session);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   317
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   318
	log("debug", "Connection attempt in progress...");
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   319
	return true;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   320
end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   321
4602
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   322
module:hook_global("service-added", function (event)
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   323
	if event.name ~= "s2s" then return end
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   324
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   325
	local s2s_sources = portmanager.get_active_services():get("s2s");
4611
8572373fa26f mod_s2s/s2sout.lib: Log message instead of traceback when s2s isn't configured for any ports
Matthew Wild <mwild1@gmail.com>
parents: 4602
diff changeset
   326
	if not s2s_sources then
8572373fa26f mod_s2s/s2sout.lib: Log message instead of traceback when s2s isn't configured for any ports
Matthew Wild <mwild1@gmail.com>
parents: 4602
diff changeset
   327
		module:log("warn", "s2s not listening on any ports, outgoing connections may fail");
8572373fa26f mod_s2s/s2sout.lib: Log message instead of traceback when s2s isn't configured for any ports
Matthew Wild <mwild1@gmail.com>
parents: 4602
diff changeset
   328
		return;
8572373fa26f mod_s2s/s2sout.lib: Log message instead of traceback when s2s isn't configured for any ports
Matthew Wild <mwild1@gmail.com>
parents: 4602
diff changeset
   329
	end
4602
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   330
	for source, _ in pairs(s2s_sources) do
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   331
		if source == "*" or source == "0.0.0.0" then
5701
746b263e09cf mod_s2s/s2sout.lib: Use new util.net.local_addresses() to fetch local interface addresses
Matthew Wild <mwild1@gmail.com>
parents: 5700
diff changeset
   332
			for _, addr in ipairs(local_addresses("ipv4", true)) do
746b263e09cf mod_s2s/s2sout.lib: Use new util.net.local_addresses() to fetch local interface addresses
Matthew Wild <mwild1@gmail.com>
parents: 5700
diff changeset
   333
				sources[#sources + 1] = new_ip(addr, "IPv4");
4602
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   334
			end
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   335
		elseif source == "::" then
5701
746b263e09cf mod_s2s/s2sout.lib: Use new util.net.local_addresses() to fetch local interface addresses
Matthew Wild <mwild1@gmail.com>
parents: 5700
diff changeset
   336
			for _, addr in ipairs(local_addresses("ipv6", true)) do
746b263e09cf mod_s2s/s2sout.lib: Use new util.net.local_addresses() to fetch local interface addresses
Matthew Wild <mwild1@gmail.com>
parents: 5700
diff changeset
   337
				sources[#sources + 1] = new_ip(addr, "IPv6");
4602
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   338
			end
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   339
		else
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   340
			sources[#sources + 1] = new_ip(source, (source:find(":") and "IPv6") or "IPv4");
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   341
		end
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   342
	end
4922
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   343
	for i = 1,#sources do
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   344
		if sources[i].proto == "IPv6" then
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   345
			has_ipv6 = true;
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   346
		elseif sources[i].proto == "IPv4" then
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   347
			has_ipv4 = true;
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   348
		end
d1fdc545f8b2 mod_s2s: Only do AAAA lookup if IPv6 is available, and A if IPv4 is available.
Kim Alvefur <zash@zash.se>
parents: 4906
diff changeset
   349
	end
4602
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   350
end);
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   351
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   352
return s2sout;