plugins/mod_s2s/s2sout.lib.lua
author Kim Alvefur <zash@zash.se>
Fri, 12 Aug 2016 01:38:40 +0200
changeset 7564 ab8324d3b899
parent 7101 5286e79c6829
child 7688 8e43a05e2374
permissions -rw-r--r--
mod_s2s: Set read mode for s2sout sockets to the same as s2sins
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;
7095
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
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
7564
ab8324d3b899 mod_s2s: Set read mode for s2sout sockets to the same as s2sins
Kim Alvefur <zash@zash.se>
parents: 7101
diff changeset
    25
local default_mode = module:get_option("network_default_read_size", 4096);
ab8324d3b899 mod_s2s: Set read mode for s2sout sockets to the same as s2sins
Kim Alvefur <zash@zash.se>
parents: 7101
diff changeset
    26
4756
f8ddaaa08a8e mod_s2s/s2sout.lib: Fix imports and some undefined variables
Matthew Wild <mwild1@gmail.com>
parents: 4629
diff changeset
    27
local log = module._log;
f8ddaaa08a8e mod_s2s/s2sout.lib: Fix imports and some undefined variables
Matthew Wild <mwild1@gmail.com>
parents: 4629
diff changeset
    28
7095
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
    29
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
    30
local has_ipv4, has_ipv6;
4569
34b1122126f6 s2sout.lib: import utils/functionality once in s2smanager.
Florian Zeitz <florob@babelmonkeys.de>
parents: 4555
diff changeset
    31
4832
6b3aec1e0d9f s2smanager, mod_s2s: Move checking DNS timeout option to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
    32
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
    33
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
    34
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
    35
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
    36
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
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
    38
4563
75bff73391fb s2sout.lib: Add locals for source interfaces
Kim Alvefur <zash@zash.se>
parents: 4562
diff changeset
    39
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
    40
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
    41
	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
    42
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
    43
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
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
    45
	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
    46
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
    47
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
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
    49
	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
    50
	host_session.version = 1;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
    51
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
    52
	-- 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
    53
	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
    54
		-- 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
    55
		-- 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
    56
		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
    57
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
    58
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
    59
	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
    60
		-- 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
    61
		-- 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
    62
		-- 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
    63
		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
    64
		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
    65
			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
    66
				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
				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
    68
			end
4756
f8ddaaa08a8e mod_s2s/s2sout.lib: Fix imports and some undefined variables
Matthew Wild <mwild1@gmail.com>
parents: 4629
diff changeset
    69
			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
    70
			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
    71
			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
    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
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
    75
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
    76
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
    77
	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
    78
	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
    79
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
    80
	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
    81
		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
    82
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
    83
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
    84
	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
    85
		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
    86
		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
    87
		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
    88
		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
    89
			handle = nil;
6920
65344c3bae7a mod_s2s/s2sout: Keep SRV lookup response around even if it's empty
Kim Alvefur <zash@zash.se>
parents: 6688
diff changeset
    90
			local srv_hosts = { answer = answer };
65344c3bae7a mod_s2s/s2sout: Keep SRV lookup response around even if it's empty
Kim Alvefur <zash@zash.se>
parents: 6688
diff changeset
    91
			host_session.srv_hosts = srv_hosts;
65344c3bae7a mod_s2s/s2sout: Keep SRV lookup response around even if it's empty
Kim Alvefur <zash@zash.se>
parents: 6688
diff changeset
    92
			host_session.srv_choice = 0;
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.connecting = nil;
5112
8b94a8d92cf3 mod_s2s: Check that an SRV reply isn't empty.
Kim Alvefur <zash@zash.se>
parents: 4987
diff changeset
    94
			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
    95
				log("debug", "%s has SRV records, handling...", 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
    96
				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
    97
					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
    98
				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
    99
				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
   100
					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
   101
					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
   102
					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
   103
				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
   104
				t_sort(srv_hosts, compare_srv_priorities);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   105
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
   106
				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
   107
				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
   108
				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
   109
					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
   110
					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
   111
				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
   112
			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
   113
				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
   114
			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
   115
			-- 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
   116
			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
   117
			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
   118
				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
   119
					-- 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
   120
					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
   121
				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
   122
			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
   123
		end, "_xmpp-server._tcp."..connect_host..".", "SRV");
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   124
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
   125
		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
   126
	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
   127
		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
   128
	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
   129
		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
   130
		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
   131
		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
   132
		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
   133
	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
   134
		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
   135
		-- 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
   136
		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
   137
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   138
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
   139
	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
   140
		-- 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
   141
		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
   142
		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
   143
	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
   144
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
	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
   146
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
   147
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
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
   149
	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
   150
	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
   151
	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
   152
	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
   153
	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
   154
		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
   155
			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
   156
			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
   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
	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
   159
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
   160
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
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
   162
	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
   163
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
	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
   165
		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
   166
		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
   167
		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
   168
		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
   169
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
   170
		if has_ipv4 then
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   171
			handle4 = adns.lookup(function (reply, err)
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   172
				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
   173
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   174
				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
   175
					for _, ip in ipairs(reply) do
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   176
						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
   177
						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
   178
					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
   179
				end
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   180
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   181
				if have_other_result then
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   182
					if #IPs > 0 then
7095
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   183
						rfc6724_dest(host_session.ip_hosts, sources);
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   184
						for i = 1, #IPs do
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   185
							IPs[i] = {ip = IPs[i], port = connect_port};
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   186
						end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   187
						host_session.ip_choice = 0;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   188
						s2sout.try_next_ip(host_session);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   189
					else
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   190
						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
   191
						host_session.ip_hosts = nil;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   192
						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
   193
							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
   194
							err = err and (": "..err) or "";
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   195
							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
   196
						end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   197
					end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   198
				else
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   199
					have_other_result = true;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   200
				end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   201
			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
   202
		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
   203
			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
   204
		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
   205
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
   206
		if has_ipv6 then
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   207
			handle6 = adns.lookup(function (reply, err)
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   208
				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
   209
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   210
				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
   211
					for _, ip in ipairs(reply) do
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   212
						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
   213
						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
   214
					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
   215
				end
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   216
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   217
				if have_other_result then
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   218
					if #IPs > 0 then
7095
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   219
						rfc6724_dest(host_session.ip_hosts, sources);
4959
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   220
						for i = 1, #IPs do
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   221
							IPs[i] = {ip = IPs[i], port = connect_port};
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   222
						end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   223
						host_session.ip_choice = 0;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   224
						s2sout.try_next_ip(host_session);
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   225
					else
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   226
						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
   227
						host_session.ip_hosts = nil;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   228
						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
   229
							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
   230
							err = err and (": "..err) or "";
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   231
							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
   232
						end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   233
					end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   234
				else
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   235
					have_other_result = true;
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   236
				end
ab696f5394cf mod_s2s/s2sout.lib: Fix indentation
Matthew Wild <mwild1@gmail.com>
parents: 4957
diff changeset
   237
			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
   238
		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
   239
			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
   240
		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
   241
		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
   242
	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
   243
		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
   244
	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
   245
		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
   246
		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
   247
			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
   248
			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
   249
			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
   250
			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
   251
		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
   252
	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
   253
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
	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
   255
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
   256
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
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
   258
	(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
   259
5388
f833d2188c16 mod_s2s: Reset secure flag on new connection attempt
Kim Alvefur <zash@zash.se>
parents: 5386
diff changeset
   260
	-- 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
   261
	-- 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
   262
	host_session.secure = nil;
5859
e327f2d4e09f mod_c2s, mod_s2s: Set session.encrypted as session.secure does not allways mean encrypted (eg consider_bosh_secure)
Kim Alvefur <zash@zash.se>
parents: 5799
diff changeset
   263
	host_session.encrypted = nil;
5388
f833d2188c16 mod_s2s: Reset secure flag on new connection attempt
Kim Alvefur <zash@zash.se>
parents: 5386
diff changeset
   264
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
   265
	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
   266
	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
   267
	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
   268
		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
   269
	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
   270
		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
   271
	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
   272
		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
   273
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   274
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
   275
	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
   276
		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
   277
		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
   278
	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
   279
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
	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
   281
	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
   282
	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
   283
		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
   284
		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
   285
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   286
7564
ab8324d3b899 mod_s2s: Set read mode for s2sout sockets to the same as s2sins
Kim Alvefur <zash@zash.se>
parents: 7101
diff changeset
   287
	conn = wrapclient(conn, connect_host.addr, connect_port, s2s_listener, default_mode);
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
   288
	host_session.conn = conn;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   289
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
   290
	-- 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
   291
	-- 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
   292
	s2s_listener.register_outgoing(conn, host_session);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5703
diff changeset
   293
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
   294
	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
   295
	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
   296
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
   297
4602
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   298
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
   299
	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
   300
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   301
	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
   302
	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
   303
		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
   304
		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
   305
	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
   306
	for source, _ in pairs(s2s_sources) do
7095
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   307
		if source == "*" or source == "0.0.0.0" then
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   308
			for _, addr in ipairs(local_addresses("ipv4", true)) do
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   309
				sources[#sources + 1] = new_ip(addr, "IPv4");
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   310
			end
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   311
		elseif source == "::" then
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   312
			for _, addr in ipairs(local_addresses("ipv6", true)) do
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   313
				sources[#sources + 1] = new_ip(addr, "IPv6");
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   314
			end
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   315
		else
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   316
			sources[#sources + 1] = new_ip(source, (source:find(":") and "IPv6") or "IPv4");
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   317
		end
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   318
	end
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   319
	for i = 1,#sources do
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   320
		if sources[i].proto == "IPv6" then
6685
63f5870f9afe mod_s2s/s2sout: Use the local address assigned to UDP sockets instead of util.net to enumerate possible source addresses
Kim Alvefur <zash@zash.se>
parents: 6683
diff changeset
   321
			has_ipv6 = true;
7095
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   322
		elseif sources[i].proto == "IPv4" then
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
   323
			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
   324
		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
   325
	end
7095
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   326
	if not (has_ipv4 or has_ipv6)  then
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   327
		module:log("warn", "No local IPv4 or IPv6 addresses detected, outgoing connections may fail");
bee63de49663 Backout 63f5870f9afe, no longer needed since Windows is currently unsupported
Kim Alvefur <zash@zash.se>
parents: 6685
diff changeset
   328
	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
   329
end);
ba898af15de5 mod_s2s: Collect s2s sources from portmanager and get local address if necessary
Florian Zeitz <florob@babelmonkeys.de>
parents: 4599
diff changeset
   330
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
   331
return s2sout;