net/server_select.lua
author Kim Alvefur <zash@zash.se>
Thu, 04 Nov 2021 01:00:06 +0100
branch0.11
changeset 12093 76b4e3f12b53
parent 11067 30d3f6f85eb8
child 11072 988ddd57e851
permissions -rw-r--r--
mod_pep: Wipe pubsub service on user deletion Data is already wiped from storage, but this ensures everything is properly unsubscribed, possibly with notifications etc. Clears recipient cache as well, since it is no longer relevant.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5664
diff changeset
     1
--
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
     2
-- server.lua by blastbeat of the luadch project
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
     3
-- Re-used here under the MIT/X Consortium License
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5664
diff changeset
     4
--
2925
692b3c6c5bd2 Merge 0.6->0.7
Matthew Wild <mwild1@gmail.com>
parents: 2923 2740
diff changeset
     5
-- Modifications (C) 2008-2010 Matthew Wild, Waqas Hussain
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
     6
--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
     7
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
     8
-- // wrapping luadch stuff // --
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
     9
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    10
local use = function( what )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
    11
	return _G[ what ]
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    12
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    13
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    14
local log, table_concat = require ("util.logger").init("socket"), table.concat;
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    15
local out_put = function (...) return log("debug", table_concat{...}); end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    16
local out_error = function (...) return log("warn", table_concat{...}); end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    17
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    18
----------------------------------// DECLARATION //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    19
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    20
--// constants //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    21
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
    22
local STAT_UNIT = 1 -- byte
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    23
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    24
--// lua functions //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    25
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    26
local type = use "type"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    27
local pairs = use "pairs"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    28
local ipairs = use "ipairs"
3685
63efe4eefa07 net.server_select: Made some globals local.
Waqas Hussain <waqas20@gmail.com>
parents: 3682
diff changeset
    29
local tonumber = use "tonumber"
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    30
local tostring = use "tostring"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    31
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    32
--// lua libs //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    33
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    34
local table = use "table"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    35
local string = use "string"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    36
local coroutine = use "coroutine"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    37
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    38
--// lua lib methods //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    39
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
    40
local math_min = math.min
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
    41
local math_huge = math.huge
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    42
local table_concat = table.concat
6484
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
    43
local table_insert = table.insert
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    44
local string_sub = string.sub
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    45
local coroutine_wrap = coroutine.wrap
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    46
local coroutine_yield = coroutine.yield
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    47
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    48
--// extern libs //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    49
6785
ec172dbe9d14 net.server_{select,event}: Don't rely on LuaSocket and LuaSec being present in the globals table
Kim Alvefur <zash@zash.se>
parents: 6462
diff changeset
    50
local has_luasec, luasec = pcall ( require , "ssl" )
2597
40a174e8cdf6 net.server_select: Fix traceback with no LuaSec available (thanks Nolan)
Matthew Wild <mwild1@gmail.com>
parents: 2582
diff changeset
    51
local luasocket = use "socket" or require "socket"
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
    52
local luasocket_gettime = luasocket.gettime
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
    53
local inet = require "util.net";
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
    54
local inet_pton = inet.pton;
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    55
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    56
--// extern lib methods //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    57
6785
ec172dbe9d14 net.server_{select,event}: Don't rely on LuaSocket and LuaSec being present in the globals table
Kim Alvefur <zash@zash.se>
parents: 6462
diff changeset
    58
local ssl_wrap = ( has_luasec and luasec.wrap )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    59
local socket_bind = luasocket.bind
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    60
local socket_select = luasocket.select
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    61
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    62
--// functions //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    63
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    64
local id
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    65
local loop
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    66
local stats
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    67
local idfalse
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    68
local closeall
3686
27d3e2a2a248 net.server_select: Made another global local.
Waqas Hussain <waqas20@gmail.com>
parents: 3685
diff changeset
    69
local addsocket
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    70
local addserver
5288
2777f34adbd3 net.server_select: Fix global access
Kim Alvefur <zash@zash.se>
parents: 5280
diff changeset
    71
local addtimer
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    72
local getserver
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    73
local wrapserver
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    74
local getsettings
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    75
local closesocket
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    76
local removesocket
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    77
local removeserver
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    78
local wrapconnection
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    79
local changesettings
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    80
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    81
--// tables //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    82
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    83
local _server
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    84
local _readlist
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    85
local _timerlist
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    86
local _sendlist
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    87
local _socketlist
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    88
local _closelist
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    89
local _readtimes
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    90
local _writetimes
7097
e8f202856fc0 server_select: Keep track of which server listeners are full
Kim Alvefur <zash@zash.se>
parents: 6381
diff changeset
    91
local _fullservers
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    92
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    93
--// simple data types //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    94
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    95
local _
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    96
local _readlistlen
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    97
local _sendlistlen
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    98
local _timerlistlen
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    99
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   100
local _sendtraffic
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   101
local _readtraffic
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   102
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   103
local _selecttimeout
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5492
diff changeset
   104
local _tcpbacklog
7098
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   105
local _accepretry
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   106
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   107
local _starttime
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   108
local _currenttime
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   109
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   110
local _maxsendlen
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   111
local _maxreadlen
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   112
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   113
local _checkinterval
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   114
local _sendtimeout
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   115
local _readtimeout
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   116
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   117
local _maxselectlen
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   118
local _maxfd
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   119
3685
63efe4eefa07 net.server_select: Made some globals local.
Waqas Hussain <waqas20@gmail.com>
parents: 3682
diff changeset
   120
local _maxsslhandshake
63efe4eefa07 net.server_select: Made some globals local.
Waqas Hussain <waqas20@gmail.com>
parents: 3682
diff changeset
   121
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   122
----------------------------------// DEFINITION //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   123
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   124
_server = { } -- key = port, value = table; list of listening servers
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   125
_readlist = { } -- array with sockets to read from
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   126
_sendlist = { } -- arrary with sockets to write to
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   127
_timerlist = { } -- array of timer functions
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   128
_socketlist = { } -- key = socket, value = wrapped socket (handlers)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   129
_readtimes = { } -- key = handler, value = timestamp of last data reading
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   130
_writetimes = { } -- key = handler, value = timestamp of last data writing/sending
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   131
_closelist = { } -- handlers to close
7097
e8f202856fc0 server_select: Keep track of which server listeners are full
Kim Alvefur <zash@zash.se>
parents: 6381
diff changeset
   132
_fullservers = { } -- servers in a paused state while there are too many clients
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   133
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   134
_readlistlen = 0 -- length of readlist
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   135
_sendlistlen = 0 -- length of sendlist
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8531
diff changeset
   136
_timerlistlen = 0 -- length of timerlist
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   137
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   138
_sendtraffic = 0 -- some stats
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   139
_readtraffic = 0
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   140
3775
f3f2a7810108 net/server_select.lua: Reduce select() timeout back to 1s
Matthew Wild <mwild1@gmail.com>
parents: 3687
diff changeset
   141
_selecttimeout = 1 -- timeout of socket.select
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5492
diff changeset
   142
_tcpbacklog = 128 -- some kind of hint to the OS
7098
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   143
_accepretry = 10 -- seconds to wait until the next attempt of a full server to accept
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   144
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   145
_maxsendlen = 51000 * 1024 -- max len of send buffer
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   146
_maxreadlen = 25000 * 1024 -- max len of read buffer
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   147
5633
d999027577ed net.server_select: Default checkinterval to 30s, so that read timeouts are actually detected
Matthew Wild <mwild1@gmail.com>
parents: 5632
diff changeset
   148
_checkinterval = 30 -- interval in secs to check idle clients
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   149
_sendtimeout = 60000 -- allowed send idle time in secs
8986
23f66f04e216 net.server: Set default read timeout to 14 minutes (fixes #971)
Kim Alvefur <zash@zash.se>
parents: 8784
diff changeset
   150
_readtimeout = 14 * 60 -- allowed read idle time in secs
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   151
5548
c5d1c35c93f4 net.server_select: Don't limit max file descriptor number on Windows.
Waqas Hussain <waqas20@gmail.com>
parents: 5531
diff changeset
   152
local is_windows = package.config:sub(1,1) == "\\" -- check the directory separator, to detemine whether this is Windows
5642
5862bb57a3f1 net.server_select: Ensure _maxfd = math.huge on Windows, always.
Waqas Hussain <waqas20@gmail.com>
parents: 5548
diff changeset
   153
_maxfd = (is_windows and math.huge) or luasocket._SETSIZE or 1024 -- max fd number, limit to 1024 by default to prevent glibc buffer overflow, but not on Windows
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   154
_maxselectlen = luasocket._SETSIZE or 1024 -- But this still applies on Windows
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   155
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   156
_maxsslhandshake = 30 -- max handshake round-trips
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   157
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   158
----------------------------------// PRIVATE //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   159
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   160
wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx ) -- this function wraps a server -- FIXME Make sure FD < _maxfd
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   161
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   162
	if socket:getfd() >= _maxfd then
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   163
		out_error("server.lua: Disallowed FD number: "..socket:getfd())
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   164
		socket:close()
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   165
		return nil, "fd-too-large"
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   166
	end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   167
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   168
	local connections = 0
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   169
4388
eded80beab58 net.server_select: Never call onincoming with nil data when a listener doesn't have an onconnect handler
Matthew Wild <mwild1@gmail.com>
parents: 4353
diff changeset
   170
	local dispatch, disconnect = listeners.onconnect, listeners.ondisconnect
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   171
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   172
	local accept = socket.accept
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   173
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   174
	--// public methods of the object //--
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   175
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   176
	local handler = { }
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   177
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   178
	handler.shutdown = function( ) end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   179
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   180
	handler.ssl = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   181
		return sslctx ~= nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   182
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   183
	handler.sslctx = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   184
		return sslctx
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   185
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   186
	handler.remove = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   187
		connections = connections - 1
5280
1514a6147e85 net.server_select: Pause servers while they are full
Kim Alvefur <zash@zash.se>
parents: 5279
diff changeset
   188
		if handler then
1514a6147e85 net.server_select: Pause servers while they are full
Kim Alvefur <zash@zash.se>
parents: 5279
diff changeset
   189
			handler.resume( )
1514a6147e85 net.server_select: Pause servers while they are full
Kim Alvefur <zash@zash.se>
parents: 5279
diff changeset
   190
		end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   191
	end
4904
5d2ff4627b72 net.server_select: Don't close client connections when closing a server (it wasn't working anyway)
Matthew Wild <mwild1@gmail.com>
parents: 4903
diff changeset
   192
	handler.close = function()
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   193
		socket:close( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   194
		_sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   195
		_readlistlen = removesocket( _readlist, socket, _readlistlen )
4675
80f2d952d4c5 net.server_select: Remove server from _server table when closing
Matthew Wild <mwild1@gmail.com>
parents: 4429
diff changeset
   196
		_server[ip..":"..serverport] = nil;
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   197
		_socketlist[ socket ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   198
		handler = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   199
		socket = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   200
		--mem_free( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   201
		out_put "server.lua: closed server handler and removed sockets from list"
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   202
	end
5330
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   203
	handler.pause = function( hard )
5279
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   204
		if not handler.paused then
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   205
			_readlistlen = removesocket( _readlist, socket, _readlistlen )
5330
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   206
			if hard then
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   207
				_socketlist[ socket ] = nil
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   208
				socket:close( )
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   209
				socket = nil;
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   210
			end
5279
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   211
			handler.paused = true;
7100
5a71aaa2c542 server_select: Add logging of when servers are paused and resumed
Kim Alvefur <zash@zash.se>
parents: 7099
diff changeset
   212
			out_put("server.lua: server [", ip, "]:", serverport, " paused")
5279
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   213
		end
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   214
	end
5330
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   215
	handler.resume = function( )
5279
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   216
		if handler.paused then
5330
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   217
			if not socket then
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5492
diff changeset
   218
				socket = socket_bind( ip, serverport, _tcpbacklog );
5330
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   219
				socket:settimeout( 0 )
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   220
			end
5279
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   221
			_readlistlen = addsocket(_readlist, socket, _readlistlen)
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   222
			_socketlist[ socket ] = handler
7097
e8f202856fc0 server_select: Keep track of which server listeners are full
Kim Alvefur <zash@zash.se>
parents: 6381
diff changeset
   223
			_fullservers[ handler ] = nil
5279
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   224
			handler.paused = false;
7100
5a71aaa2c542 server_select: Add logging of when servers are paused and resumed
Kim Alvefur <zash@zash.se>
parents: 7099
diff changeset
   225
			out_put("server.lua: server [", ip, "]:", serverport, " resumed")
5279
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   226
		end
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   227
	end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   228
	handler.ip = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   229
		return ip
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   230
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   231
	handler.serverport = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   232
		return serverport
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   233
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   234
	handler.socket = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   235
		return socket
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   236
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   237
	handler.readbuffer = function( )
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   238
		if _readlistlen >= _maxselectlen or _sendlistlen >= _maxselectlen then
5280
1514a6147e85 net.server_select: Pause servers while they are full
Kim Alvefur <zash@zash.se>
parents: 5279
diff changeset
   239
			handler.pause( )
7097
e8f202856fc0 server_select: Keep track of which server listeners are full
Kim Alvefur <zash@zash.se>
parents: 6381
diff changeset
   240
			_fullservers[ handler ] = _currenttime
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   241
			out_put( "server.lua: refused new client connection: server full" )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   242
			return false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   243
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   244
		local client, err = accept( socket )	-- try to accept
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   245
		if client then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   246
			local ip, clientport = client:getpeername( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   247
			local handler, client, err = wrapconnection( handler, listeners, client, ip, serverport, clientport, pattern, sslctx ) -- wrap new client socket
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   248
			if err then -- error while wrapping ssl socket
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   249
				return false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   250
			end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   251
			connections = connections + 1
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   252
			out_put( "server.lua: accepted new client connection from ", tostring(ip), ":", tostring(clientport), " to ", tostring(serverport))
5492
5d0cc5de5c51 net.server_select: Don't call onconnect twice for SSL connections
Matthew Wild <mwild1@gmail.com>
parents: 5491
diff changeset
   253
			if dispatch and not sslctx then -- SSL connections will notify onconnect when handshake completes
4388
eded80beab58 net.server_select: Never call onincoming with nil data when a listener doesn't have an onconnect handler
Matthew Wild <mwild1@gmail.com>
parents: 4353
diff changeset
   254
				return dispatch( handler );
eded80beab58 net.server_select: Never call onincoming with nil data when a listener doesn't have an onconnect handler
Matthew Wild <mwild1@gmail.com>
parents: 4353
diff changeset
   255
			end
eded80beab58 net.server_select: Never call onincoming with nil data when a listener doesn't have an onconnect handler
Matthew Wild <mwild1@gmail.com>
parents: 4353
diff changeset
   256
			return;
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   257
		elseif err then -- maybe timeout or something else
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   258
			out_put( "server.lua: error with new client connection: ", tostring(err) )
7099
95e4c81291cc server_select: Pause and mark server as full if accepting a client fails (fixes #597)
Kim Alvefur <zash@zash.se>
parents: 7098
diff changeset
   259
			handler.pause( )
95e4c81291cc server_select: Pause and mark server as full if accepting a client fails (fixes #597)
Kim Alvefur <zash@zash.se>
parents: 7098
diff changeset
   260
			_fullservers[ handler ] = _currenttime
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   261
			return false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   262
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   263
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   264
	return handler
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   265
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   266
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   267
wrapconnection = function( server, listeners, socket, ip, serverport, clientport, pattern, sslctx, extra ) -- this function wraps a client to a handler object
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   268
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   269
	if socket:getfd() >= _maxfd then
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   270
		out_error("server.lua: Disallowed FD number: "..socket:getfd()) -- PROTIP: Switch to libevent
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   271
		socket:close( ) -- Should we send some kind of error here?
5663
4e51ceee469c net.server_select: Make sure there is a server to pause when hitting maxfd (Thanks elghinn)
Kim Alvefur <zash@zash.se>
parents: 5642
diff changeset
   272
		if server then
7097
e8f202856fc0 server_select: Keep track of which server listeners are full
Kim Alvefur <zash@zash.se>
parents: 6381
diff changeset
   273
			_fullservers[ server ] = _currenttime
5663
4e51ceee469c net.server_select: Make sure there is a server to pause when hitting maxfd (Thanks elghinn)
Kim Alvefur <zash@zash.se>
parents: 5642
diff changeset
   274
			server.pause( )
4e51ceee469c net.server_select: Make sure there is a server to pause when hitting maxfd (Thanks elghinn)
Kim Alvefur <zash@zash.se>
parents: 5642
diff changeset
   275
		end
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   276
		return nil, nil, "fd-too-large"
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   277
	end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   278
	socket:settimeout( 0 )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   279
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   280
	--// local import of socket methods //--
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   281
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   282
	local send
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   283
	local receive
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   284
	local shutdown
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   285
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   286
	--// private closures of the object //--
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   287
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   288
	local ssl
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   289
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   290
	local dispatch = listeners.onincoming
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   291
	local status = listeners.onstatus
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   292
	local disconnect = listeners.ondisconnect
3002
d1f864ed44c0 net.server_select, net.server_event: Support for ondrain listener callback for when send buffer is empty
Matthew Wild <mwild1@gmail.com>
parents: 3001
diff changeset
   293
	local drain = listeners.ondrain
5846
b8c7656481ac server_select: fix onreadtimeout support so that listeners can override the default (disconnect) behaviour
Matthew Wild <mwild1@gmail.com>
parents: 5824
diff changeset
   294
	local onreadtimeout = listeners.onreadtimeout;
6381
9ffd582c65d8 net.server_select: 'listener'->'listeners' (fixes undefined global access)
Matthew Wild <mwild1@gmail.com>
parents: 6379
diff changeset
   295
	local detach = listeners.ondetach
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   296
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   297
	local bufferqueue = { } -- buffer array
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   298
	local bufferqueuelen = 0	-- end of buffer array
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   299
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   300
	local toclose
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   301
	local needtls
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   302
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   303
	local bufferlen = 0
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   304
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   305
	local noread = false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   306
	local nosend = false
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   307
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   308
	local sendtraffic, readtraffic = 0, 0
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   309
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   310
	local maxsendlen = _maxsendlen
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   311
	local maxreadlen = _maxreadlen
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   312
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   313
	--// public methods of the object //--
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   314
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   315
	local handler = bufferqueue -- saves a table ^_^
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   316
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   317
	handler.extra = extra
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   318
	if extra then
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   319
		handler.servername = extra.servername
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   320
	end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   321
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   322
	handler.dispatch = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   323
		return dispatch
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   324
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   325
	handler.disconnect = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   326
		return disconnect
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   327
	end
5846
b8c7656481ac server_select: fix onreadtimeout support so that listeners can override the default (disconnect) behaviour
Matthew Wild <mwild1@gmail.com>
parents: 5824
diff changeset
   328
	handler.onreadtimeout = onreadtimeout;
b8c7656481ac server_select: fix onreadtimeout support so that listeners can override the default (disconnect) behaviour
Matthew Wild <mwild1@gmail.com>
parents: 5824
diff changeset
   329
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   330
	handler.setlistener = function( self, listeners, data )
6379
a280bd6ccce2 net.server_{select,event}: Add 'ondetach' callback for listener objects, to notify them when another listener is being assigned to a connection
Matthew Wild <mwild1@gmail.com>
parents: 6314
diff changeset
   331
		if detach then
a280bd6ccce2 net.server_{select,event}: Add 'ondetach' callback for listener objects, to notify them when another listener is being assigned to a connection
Matthew Wild <mwild1@gmail.com>
parents: 6314
diff changeset
   332
			detach(self) -- Notify listener that it is no longer responsible for this connection
a280bd6ccce2 net.server_{select,event}: Add 'ondetach' callback for listener objects, to notify them when another listener is being assigned to a connection
Matthew Wild <mwild1@gmail.com>
parents: 6314
diff changeset
   333
		end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   334
		dispatch = listeners.onincoming
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   335
		disconnect = listeners.ondisconnect
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   336
		status = listeners.onstatus
3002
d1f864ed44c0 net.server_select, net.server_event: Support for ondrain listener callback for when send buffer is empty
Matthew Wild <mwild1@gmail.com>
parents: 3001
diff changeset
   337
		drain = listeners.ondrain
5846
b8c7656481ac server_select: fix onreadtimeout support so that listeners can override the default (disconnect) behaviour
Matthew Wild <mwild1@gmail.com>
parents: 5824
diff changeset
   338
		handler.onreadtimeout = listeners.onreadtimeout
6379
a280bd6ccce2 net.server_{select,event}: Add 'ondetach' callback for listener objects, to notify them when another listener is being assigned to a connection
Matthew Wild <mwild1@gmail.com>
parents: 6314
diff changeset
   339
		detach = listeners.ondetach
9388
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   340
		if listeners.onattach then
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   341
			listeners.onattach(self, data)
9388
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   342
		end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   343
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   344
	handler.getstats = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   345
		return readtraffic, sendtraffic
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   346
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   347
	handler.ssl = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   348
		return ssl
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   349
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   350
	handler.sslctx = function ( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   351
		return sslctx
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   352
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   353
	handler.send = function( _, data, i, j )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   354
		return send( socket, data, i, j )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   355
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   356
	handler.receive = function( pattern, prefix )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   357
		return receive( socket, pattern, prefix )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   358
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   359
	handler.shutdown = function( pattern )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   360
		return shutdown( socket, pattern )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   361
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   362
	handler.setoption = function (self, option, value)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   363
		if socket.setoption then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   364
			return socket:setoption(option, value);
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   365
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   366
		return false, "setoption not implemented";
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   367
	end
4980
2e35cfe11835 net.server_select: Never call ondisconnect() directly, go via handler:close() or handler:force_close() - fixes cases where ondisconnect() could be called multiple times for the same connection, leading to issues with s2sout retry logic.
Matthew Wild <mwild1@gmail.com>
parents: 4962
diff changeset
   368
	handler.force_close = function ( self, err )
4962
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   369
		if bufferqueuelen ~= 0 then
4980
2e35cfe11835 net.server_select: Never call ondisconnect() directly, go via handler:close() or handler:force_close() - fixes cases where ondisconnect() could be called multiple times for the same connection, leading to issues with s2sout retry logic.
Matthew Wild <mwild1@gmail.com>
parents: 4962
diff changeset
   370
			out_put("server.lua: discarding unwritten data for ", tostring(ip), ":", tostring(clientport))
4962
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   371
			bufferqueuelen = 0;
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   372
		end
4980
2e35cfe11835 net.server_select: Never call ondisconnect() directly, go via handler:close() or handler:force_close() - fixes cases where ondisconnect() could be called multiple times for the same connection, leading to issues with s2sout retry logic.
Matthew Wild <mwild1@gmail.com>
parents: 4962
diff changeset
   373
		return self:close(err);
4962
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   374
	end
4980
2e35cfe11835 net.server_select: Never call ondisconnect() directly, go via handler:close() or handler:force_close() - fixes cases where ondisconnect() could be called multiple times for the same connection, leading to issues with s2sout retry logic.
Matthew Wild <mwild1@gmail.com>
parents: 4962
diff changeset
   375
	handler.close = function( self, err )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   376
		if not handler then return true; end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   377
		_readlistlen = removesocket( _readlist, socket, _readlistlen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   378
		_readtimes[ handler ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   379
		if bufferqueuelen ~= 0 then
4962
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   380
			handler.sendbuffer() -- Try now to send any outstanding data
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   381
			if bufferqueuelen ~= 0 then -- Still not empty, so we'll try again later
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   382
				if handler then
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   383
					handler.write = nil -- ... but no further writing allowed
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   384
				end
4962
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   385
				toclose = true
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   386
				return false
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   387
			end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   388
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   389
		if socket then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   390
			_ = shutdown and shutdown( socket )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   391
			socket:close( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   392
			_sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   393
			_socketlist[ socket ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   394
			socket = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   395
		else
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   396
			out_put "server.lua: socket already closed"
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   397
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   398
		if handler then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   399
			_writetimes[ handler ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   400
			_closelist[ handler ] = nil
4903
c576d2175fa4 net.server_select: Call ondisconnect handler, even if we closed the socket ourselves (fixes HTTP session hoarding, thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4888
diff changeset
   401
			local _handler = handler;
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   402
			handler = nil
4903
c576d2175fa4 net.server_select: Call ondisconnect handler, even if we closed the socket ourselves (fixes HTTP session hoarding, thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4888
diff changeset
   403
			if disconnect then
4980
2e35cfe11835 net.server_select: Never call ondisconnect() directly, go via handler:close() or handler:force_close() - fixes cases where ondisconnect() could be called multiple times for the same connection, leading to issues with s2sout retry logic.
Matthew Wild <mwild1@gmail.com>
parents: 4962
diff changeset
   404
				disconnect(_handler, err or false);
2e35cfe11835 net.server_select: Never call ondisconnect() directly, go via handler:close() or handler:force_close() - fixes cases where ondisconnect() could be called multiple times for the same connection, leading to issues with s2sout retry logic.
Matthew Wild <mwild1@gmail.com>
parents: 4962
diff changeset
   405
				disconnect = nil
4903
c576d2175fa4 net.server_select: Call ondisconnect handler, even if we closed the socket ourselves (fixes HTTP session hoarding, thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4888
diff changeset
   406
			end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   407
		end
3310
ddcab5be2a5e net.server_select: Fix a snippet of code that was living at the wrong indentation level
Matthew Wild <mwild1@gmail.com>
parents: 3008
diff changeset
   408
		if server then
ddcab5be2a5e net.server_select: Fix a snippet of code that was living at the wrong indentation level
Matthew Wild <mwild1@gmail.com>
parents: 3008
diff changeset
   409
			server.remove( )
ddcab5be2a5e net.server_select: Fix a snippet of code that was living at the wrong indentation level
Matthew Wild <mwild1@gmail.com>
parents: 3008
diff changeset
   410
		end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   411
		out_put "server.lua: closed client handler and removed socket from list"
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   412
		return true
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   413
	end
7069
7d5a1fb9bf9e net.server_select: Add 'server' method to client connections (present in server_event)
Kim Alvefur <zash@zash.se>
parents: 7046
diff changeset
   414
	handler.server = function ( )
7d5a1fb9bf9e net.server_select: Add 'server' method to client connections (present in server_event)
Kim Alvefur <zash@zash.se>
parents: 7046
diff changeset
   415
		return server
7d5a1fb9bf9e net.server_select: Add 'server' method to client connections (present in server_event)
Kim Alvefur <zash@zash.se>
parents: 7046
diff changeset
   416
	end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   417
	handler.ip = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   418
		return ip
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   419
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   420
	handler.serverport = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   421
		return serverport
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   422
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   423
	handler.clientport = function( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   424
		return clientport
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   425
	end
6047
4db0403bfc0d net.server_{select,event}: Add compat code for supporting the same client port API on connections
Kim Alvefur <zash@zash.se>
parents: 5949
diff changeset
   426
	handler.port = handler.clientport -- COMPAT server_event
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   427
	local write = function( self, data )
7739
5a07fe977002 net.server_select: Prevent writes after a handler is closed (fixes #783 I hope)
Kim Alvefur <zash@zash.se>
parents: 7100
diff changeset
   428
		if not handler then return false end
5337
c22dd451487f net.server_select: Use # operator instead of string.len
Kim Alvefur <zash@zash.se>
parents: 5331
diff changeset
   429
		bufferlen = bufferlen + #data
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   430
		if bufferlen > maxsendlen then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   431
			_closelist[ handler ] = "send buffer exceeded"	 -- cannot close the client at the moment, have to wait to the end of the cycle
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8531
diff changeset
   432
			handler.write = idfalse -- don't write anymore
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   433
			return false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   434
		elseif socket and not _sendlist[ socket ] then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   435
			_sendlistlen = addsocket(_sendlist, socket, _sendlistlen)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   436
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   437
		bufferqueuelen = bufferqueuelen + 1
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   438
		bufferqueue[ bufferqueuelen ] = data
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   439
		if handler then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   440
			_writetimes[ handler ] = _writetimes[ handler ] or _currenttime
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   441
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   442
		return true
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   443
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   444
	handler.write = write
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   445
	handler.bufferqueue = function( self )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   446
		return bufferqueue
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   447
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   448
	handler.socket = function( self )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   449
		return socket
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   450
	end
3001
fa00c6f563b4 net.server_select, net.server_event: Rename :pattern() method to :set_mode() for select backend, and add :set_mode() to event backend
Matthew Wild <mwild1@gmail.com>
parents: 3000
diff changeset
   451
	handler.set_mode = function( self, new )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   452
		pattern = new or pattern
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   453
		return pattern
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   454
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   455
	handler.set_send = function ( self, newsend )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   456
		send = newsend or send
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   457
		return send
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   458
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   459
	handler.bufferlen = function( self, readlen, sendlen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   460
		maxsendlen = sendlen or maxsendlen
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   461
		maxreadlen = readlen or maxreadlen
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   462
		return bufferlen, maxreadlen, maxsendlen
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   463
	end
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2970
diff changeset
   464
	--TODO: Deprecate
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   465
	handler.lock_read = function (self, switch)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   466
		if switch == true then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   467
			local tmp = _readlistlen
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   468
			_readlistlen = removesocket( _readlist, socket, _readlistlen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   469
			_readtimes[ handler ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   470
			if _readlistlen ~= tmp then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   471
				noread = true
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   472
			end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   473
		elseif switch == false then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   474
			if noread then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   475
				noread = false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   476
				_readlistlen = addsocket(_readlist, socket, _readlistlen)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   477
				_readtimes[ handler ] = _currenttime
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   478
			end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   479
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   480
		return noread
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   481
	end
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2970
diff changeset
   482
	handler.pause = function (self)
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2970
diff changeset
   483
		return self:lock_read(true);
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2970
diff changeset
   484
	end
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2970
diff changeset
   485
	handler.resume = function (self)
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2970
diff changeset
   486
		return self:lock_read(false);
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2970
diff changeset
   487
	end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   488
	handler.lock = function( self, switch )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   489
		handler.lock_read (switch)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   490
		if switch == true then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   491
			handler.write = idfalse
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   492
			local tmp = _sendlistlen
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   493
			_sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   494
			_writetimes[ handler ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   495
			if _sendlistlen ~= tmp then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   496
				nosend = true
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   497
			end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   498
		elseif switch == false then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   499
			handler.write = write
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   500
			if nosend then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   501
				nosend = false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   502
				write( "" )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   503
			end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   504
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   505
		return noread, nosend
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   506
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   507
	local _readbuffer = function( ) -- this function reads data
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   508
		local buffer, err, part = receive( socket, pattern )	-- receive buffer with "pattern"
3002
d1f864ed44c0 net.server_select, net.server_event: Support for ondrain listener callback for when send buffer is empty
Matthew Wild <mwild1@gmail.com>
parents: 3001
diff changeset
   509
		if not err or (err == "wantread" or err == "timeout") then -- received something
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   510
			local buffer = buffer or part or ""
5337
c22dd451487f net.server_select: Use # operator instead of string.len
Kim Alvefur <zash@zash.se>
parents: 5331
diff changeset
   511
			local len = #buffer
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   512
			if len > maxreadlen then
4980
2e35cfe11835 net.server_select: Never call ondisconnect() directly, go via handler:close() or handler:force_close() - fixes cases where ondisconnect() could be called multiple times for the same connection, leading to issues with s2sout retry logic.
Matthew Wild <mwild1@gmail.com>
parents: 4962
diff changeset
   513
				handler:close( "receive buffer exceeded" )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   514
				return false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   515
			end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   516
			local count = len * STAT_UNIT
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   517
			readtraffic = readtraffic + count
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   518
			_readtraffic = _readtraffic + count
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   519
			_readtimes[ handler ] = _currenttime
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   520
			--out_put( "server.lua: read data '", buffer:gsub("[^%w%p ]", "."), "', error: ", err )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   521
			return dispatch( handler, buffer, err )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   522
		else	-- connections was closed or fatal error
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   523
			out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " read error: ", tostring(err) )
4980
2e35cfe11835 net.server_select: Never call ondisconnect() directly, go via handler:close() or handler:force_close() - fixes cases where ondisconnect() could be called multiple times for the same connection, leading to issues with s2sout retry logic.
Matthew Wild <mwild1@gmail.com>
parents: 4962
diff changeset
   524
			_ = handler and handler:force_close( err )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   525
			return false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   526
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   527
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   528
	local _sendbuffer = function( ) -- this function sends data
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   529
		local succ, err, byte, buffer, count;
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   530
		if socket then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   531
			buffer = table_concat( bufferqueue, "", 1, bufferqueuelen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   532
			succ, err, byte = send( socket, buffer, 1, bufferlen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   533
			count = ( succ or byte or 0 ) * STAT_UNIT
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   534
			sendtraffic = sendtraffic + count
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   535
			_sendtraffic = _sendtraffic + count
5338
3df649ec43ea net.server_select: Optimization, clean bufferqueue when it makes sense.
Kim Alvefur <zash@zash.se>
parents: 5337
diff changeset
   536
			for i = bufferqueuelen,1,-1 do
3df649ec43ea net.server_select: Optimization, clean bufferqueue when it makes sense.
Kim Alvefur <zash@zash.se>
parents: 5337
diff changeset
   537
				bufferqueue[ i ] = nil
3df649ec43ea net.server_select: Optimization, clean bufferqueue when it makes sense.
Kim Alvefur <zash@zash.se>
parents: 5337
diff changeset
   538
			end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   539
			--out_put( "server.lua: sended '", buffer, "', bytes: ", tostring(succ), ", error: ", tostring(err), ", part: ", tostring(byte), ", to: ", tostring(ip), ":", tostring(clientport) )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   540
		else
4962
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   541
			succ, err, count = false, "unexpected close", 0;
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   542
		end
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8531
diff changeset
   543
		if succ then	-- sending successful
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   544
			bufferqueuelen = 0
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   545
			bufferlen = 0
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   546
			_sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   547
			_writetimes[ handler ] = nil
3002
d1f864ed44c0 net.server_select, net.server_event: Support for ondrain listener callback for when send buffer is empty
Matthew Wild <mwild1@gmail.com>
parents: 3001
diff changeset
   548
			if drain then
d1f864ed44c0 net.server_select, net.server_event: Support for ondrain listener callback for when send buffer is empty
Matthew Wild <mwild1@gmail.com>
parents: 3001
diff changeset
   549
				drain(handler)
d1f864ed44c0 net.server_select, net.server_event: Support for ondrain listener callback for when send buffer is empty
Matthew Wild <mwild1@gmail.com>
parents: 3001
diff changeset
   550
			end
3398
abc4a52aef02 net.server_select: Remove 'now' parameter from starttls(), and base it on whether the sendbuffer is empty instead
Matthew Wild <mwild1@gmail.com>
parents: 3382
diff changeset
   551
			_ = needtls and handler:starttls(nil)
4962
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   552
			_ = toclose and handler:force_close( )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   553
			return true
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   554
		elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   555
			buffer = string_sub( buffer, byte + 1, bufferlen ) -- new buffer
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   556
			bufferqueue[ 1 ] = buffer	 -- insert new buffer in queue
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   557
			bufferqueuelen = 1
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   558
			bufferlen = bufferlen - byte
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   559
			_writetimes[ handler ] = _currenttime
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   560
			return true
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   561
		else	-- connection was closed during sending or fatal error
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   562
			out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " write error: ", tostring(err) )
4980
2e35cfe11835 net.server_select: Never call ondisconnect() directly, go via handler:close() or handler:force_close() - fixes cases where ondisconnect() could be called multiple times for the same connection, leading to issues with s2sout retry logic.
Matthew Wild <mwild1@gmail.com>
parents: 4962
diff changeset
   563
			_ = handler and handler:force_close( err )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   564
			return false
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   565
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   566
	end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   567
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   568
	-- Set the sslctx
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   569
	local handshake;
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   570
	function handler.set_sslctx(self, new_sslctx)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   571
		sslctx = new_sslctx;
4347
4b5290dd4e58 net.server_select: Small fix to SSL handshake logic, read/wrote were being checked despite it not being possible for them to be other than nil
Matthew Wild <mwild1@gmail.com>
parents: 4346
diff changeset
   572
		local read, wrote
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   573
		handshake = coroutine_wrap( function( client ) -- create handshake coroutine
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   574
				local err
7504
8c3d93b67560 net.server_select: remove unused one-letter loop variable [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7471
diff changeset
   575
				for _ = 1, _maxsslhandshake do
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   576
					_sendlistlen = ( wrote and removesocket( _sendlist, client, _sendlistlen ) ) or _sendlistlen
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   577
					_readlistlen = ( read and removesocket( _readlist, client, _readlistlen ) ) or _readlistlen
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   578
					read, wrote = nil, nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   579
					_, err = client:dohandshake( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   580
					if not err then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   581
						out_put( "server.lua: ssl handshake done" )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   582
						handler.readbuffer = _readbuffer	-- when handshake is done, replace the handshake function with regular functions
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   583
						handler.sendbuffer = _sendbuffer
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   584
						_ = status and status( handler, "ssl-handshake-complete" )
5490
ab821566ede8 Backed out changeset f2631a14b953
Matthew Wild <mwild1@gmail.com>
parents: 5482
diff changeset
   585
						if self.autostart_ssl and listeners.onconnect then
ab821566ede8 Backed out changeset f2631a14b953
Matthew Wild <mwild1@gmail.com>
parents: 5482
diff changeset
   586
							listeners.onconnect(self);
6436
b93402cec1c4 net.server_select: When an SSL handshake is connected, if there is pending data to be written to the socket, mark the socket as waiting to send (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6382
diff changeset
   587
							if bufferqueuelen ~= 0 then
b93402cec1c4 net.server_select: When an SSL handshake is connected, if there is pending data to be written to the socket, mark the socket as waiting to send (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6382
diff changeset
   588
								_sendlistlen = addsocket(_sendlist, client, _sendlistlen)
b93402cec1c4 net.server_select: When an SSL handshake is connected, if there is pending data to be written to the socket, mark the socket as waiting to send (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6382
diff changeset
   589
							end
5490
ab821566ede8 Backed out changeset f2631a14b953
Matthew Wild <mwild1@gmail.com>
parents: 5482
diff changeset
   590
						end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   591
						_readlistlen = addsocket(_readlist, client, _readlistlen)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   592
						return true
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   593
					else
4347
4b5290dd4e58 net.server_select: Small fix to SSL handshake logic, read/wrote were being checked despite it not being possible for them to be other than nil
Matthew Wild <mwild1@gmail.com>
parents: 4346
diff changeset
   594
						if err == "wantwrite" then
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   595
							_sendlistlen = addsocket(_sendlist, client, _sendlistlen)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   596
							wrote = true
4347
4b5290dd4e58 net.server_select: Small fix to SSL handshake logic, read/wrote were being checked despite it not being possible for them to be other than nil
Matthew Wild <mwild1@gmail.com>
parents: 4346
diff changeset
   597
						elseif err == "wantread" then
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   598
							_readlistlen = addsocket(_readlist, client, _readlistlen)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   599
							read = true
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   600
						else
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   601
							break;
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   602
						end
4348
5b240c6b5334 net.server_select: Update error logging logic during SSL handshake (now shows correctly when a handshake exceeded max. allowed iterations)
Matthew Wild <mwild1@gmail.com>
parents: 4347
diff changeset
   603
						err = nil;
5b240c6b5334 net.server_select: Update error logging logic during SSL handshake (now shows correctly when a handshake exceeded max. allowed iterations)
Matthew Wild <mwild1@gmail.com>
parents: 4347
diff changeset
   604
						coroutine_yield( ) -- handshake not finished
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   605
					end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   606
				end
7046
14bc5593b97e server_select: Forward the actual TLS handshake error message
Kim Alvefur <zash@zash.se>
parents: 7044
diff changeset
   607
				err = "ssl handshake error: " .. ( err or "handshake too long" );
14bc5593b97e server_select: Forward the actual TLS handshake error message
Kim Alvefur <zash@zash.se>
parents: 7044
diff changeset
   608
				out_put( "server.lua: ", err );
14bc5593b97e server_select: Forward the actual TLS handshake error message
Kim Alvefur <zash@zash.se>
parents: 7044
diff changeset
   609
				_ = handler and handler:force_close(err)
5484
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   610
				return false, err -- handshake failed
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   611
			end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   612
		)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   613
	end
6785
ec172dbe9d14 net.server_{select,event}: Don't rely on LuaSocket and LuaSec being present in the globals table
Kim Alvefur <zash@zash.se>
parents: 6462
diff changeset
   614
	if has_luasec then
4349
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   615
		handler.starttls = function( self, _sslctx)
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   616
			if _sslctx then
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   617
				handler:set_sslctx(_sslctx);
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   618
			end
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   619
			if bufferqueuelen > 0 then
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   620
				out_put "server.lua: we need to do tls, but delaying until send buffer empty"
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   621
				needtls = true
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   622
				return
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   623
			end
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   624
			out_put( "server.lua: attempting to start tls on " .. tostring( socket ) )
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   625
			local oldsocket, err = socket
2582
d6afb6d919df net.server_select: Only allow starttls if luasec is available (thanks Nolan)
Matthew Wild <mwild1@gmail.com>
parents: 2581
diff changeset
   626
			socket, err = ssl_wrap( socket, sslctx )	-- wrap socket
4349
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   627
			if not socket then
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   628
				out_put( "server.lua: error while starting tls on client: ", tostring(err or "unknown error") )
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   629
				return nil, err -- fatal error
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   630
			end
4349
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   631
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   632
			if socket.sni and self.servername then
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   633
				socket:sni(self.servername);
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   634
			end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   635
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   636
			socket:settimeout( 0 )
4349
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   637
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   638
			-- add the new socket to our system
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   639
			send = socket.send
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   640
			receive = socket.receive
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   641
			shutdown = id
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   642
			_socketlist[ socket ] = handler
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   643
			_readlistlen = addsocket(_readlist, socket, _readlistlen)
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5664
diff changeset
   644
4349
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   645
			-- remove traces of the old socket
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   646
			_readlistlen = removesocket( _readlist, oldsocket, _readlistlen )
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   647
			_sendlistlen = removesocket( _sendlist, oldsocket, _sendlistlen )
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   648
			_socketlist[ oldsocket ] = nil
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   649
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   650
			handler.starttls = nil
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   651
			needtls = nil
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   652
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   653
			-- Secure now (if handshake fails connection will close)
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   654
			ssl = true
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   655
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   656
			handler.readbuffer = handshake
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   657
			handler.sendbuffer = handshake
5484
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   658
			return handshake( socket ) -- do handshake
4349
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   659
		end
4429
8e02ba75ef06 net.server_select: Autostart SSL negotiation as the last part of socket setup to avoid a traceback (#262) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4399
diff changeset
   660
	end
2582
d6afb6d919df net.server_select: Only allow starttls if luasec is available (thanks Nolan)
Matthew Wild <mwild1@gmail.com>
parents: 2581
diff changeset
   661
4429
8e02ba75ef06 net.server_select: Autostart SSL negotiation as the last part of socket setup to avoid a traceback (#262) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4399
diff changeset
   662
	handler.readbuffer = _readbuffer
8e02ba75ef06 net.server_select: Autostart SSL negotiation as the last part of socket setup to avoid a traceback (#262) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4399
diff changeset
   663
	handler.sendbuffer = _sendbuffer
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   664
	send = socket.send
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   665
	receive = socket.receive
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   666
	shutdown = ( ssl and id ) or socket.shutdown
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   667
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   668
	_socketlist[ socket ] = handler
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   669
	_readlistlen = addsocket(_readlist, socket, _readlistlen)
4429
8e02ba75ef06 net.server_select: Autostart SSL negotiation as the last part of socket setup to avoid a traceback (#262) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4399
diff changeset
   670
6785
ec172dbe9d14 net.server_{select,event}: Don't rely on LuaSocket and LuaSec being present in the globals table
Kim Alvefur <zash@zash.se>
parents: 6462
diff changeset
   671
	if sslctx and has_luasec then
4429
8e02ba75ef06 net.server_select: Autostart SSL negotiation as the last part of socket setup to avoid a traceback (#262) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4399
diff changeset
   672
		out_put "server.lua: auto-starting ssl negotiation..."
8e02ba75ef06 net.server_select: Autostart SSL negotiation as the last part of socket setup to avoid a traceback (#262) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4399
diff changeset
   673
		handler.autostart_ssl = true;
5484
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   674
		local ok, err = handler:starttls(sslctx);
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   675
		if ok == false then
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   676
			return nil, nil, err
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   677
		end
4429
8e02ba75ef06 net.server_select: Autostart SSL negotiation as the last part of socket setup to avoid a traceback (#262) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4399
diff changeset
   678
	end
8e02ba75ef06 net.server_select: Autostart SSL negotiation as the last part of socket setup to avoid a traceback (#262) (thanks Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4399
diff changeset
   679
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   680
	return handler, socket
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   681
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   682
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   683
id = function( )
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   684
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   685
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   686
idfalse = function( )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   687
	return false
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   688
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   689
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   690
addsocket = function( list, socket, len )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   691
	if not list[ socket ] then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   692
		len = len + 1
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   693
		list[ len ] = socket
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   694
		list[ socket ] = len
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   695
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   696
	return len;
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   697
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   698
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   699
removesocket = function( list, socket, len )	-- this function removes sockets from a list ( copied from copas )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   700
	local pos = list[ socket ]
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   701
	if pos then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   702
		list[ socket ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   703
		local last = list[ len ]
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   704
		list[ len ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   705
		if last ~= socket then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   706
			list[ last ] = pos
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   707
			list[ pos ] = last
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   708
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   709
		return len - 1
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   710
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   711
	return len
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   712
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   713
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   714
closesocket = function( socket )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   715
	_sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   716
	_readlistlen = removesocket( _readlist, socket, _readlistlen )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   717
	_socketlist[ socket ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   718
	socket:close( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   719
	--mem_free( )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   720
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   721
3003
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   722
local function link(sender, receiver, buffersize)
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   723
	local sender_locked;
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   724
	local _sendbuffer = receiver.sendbuffer;
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   725
	function receiver.sendbuffer()
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   726
		_sendbuffer();
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   727
		if sender_locked and receiver.bufferlen() < buffersize then
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   728
			sender:lock_read(false); -- Unlock now
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   729
			sender_locked = nil;
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   730
		end
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   731
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5664
diff changeset
   732
3003
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   733
	local _readbuffer = sender.readbuffer;
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   734
	function sender.readbuffer()
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   735
		_readbuffer();
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   736
		if not sender_locked and receiver.bufferlen() >= buffersize then
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   737
			sender_locked = true;
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   738
			sender:lock_read(true);
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   739
		end
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   740
	end
6314
8029b8a5f37a net.server_select/event: Switch sender mode to *a when reading, to make sure we get all available data
Matthew Wild <mwild1@gmail.com>
parents: 6047
diff changeset
   741
	sender:set_mode("*a");
3003
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   742
end
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
   743
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   744
----------------------------------// PUBLIC //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   745
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   746
addserver = function( addr, port, listeners, pattern, sslctx ) -- this function provides a way for other scripts to reg a server
6815
7af63377a1cf net/server_select: Check arguments to add_server correctly
daurnimator <quae@daurnimator.com>
parents: 6785
diff changeset
   747
	addr = addr or "*"
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   748
	local err
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   749
	if type( listeners ) ~= "table" then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   750
		err = "invalid listener table"
6815
7af63377a1cf net/server_select: Check arguments to add_server correctly
daurnimator <quae@daurnimator.com>
parents: 6785
diff changeset
   751
	elseif type ( addr ) ~= "string" then
7af63377a1cf net/server_select: Check arguments to add_server correctly
daurnimator <quae@daurnimator.com>
parents: 6785
diff changeset
   752
		err = "invalid address"
7af63377a1cf net/server_select: Check arguments to add_server correctly
daurnimator <quae@daurnimator.com>
parents: 6785
diff changeset
   753
	elseif type( port ) ~= "number" or not ( port >= 0 and port <= 65535 ) then
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   754
		err = "invalid port"
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   755
	elseif _server[ addr..":"..port ] then
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   756
		err = "listeners on '[" .. addr .. "]:" .. port .. "' already exist"
6785
ec172dbe9d14 net.server_{select,event}: Don't rely on LuaSocket and LuaSec being present in the globals table
Kim Alvefur <zash@zash.se>
parents: 6462
diff changeset
   757
	elseif sslctx and not has_luasec then
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   758
		err = "luasec not found"
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   759
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   760
	if err then
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   761
		out_error( "server.lua, [", addr, "]:", port, ": ", err )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   762
		return nil, err
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   763
	end
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5492
diff changeset
   764
	local server, err = socket_bind( addr, port, _tcpbacklog )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   765
	if err then
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   766
		out_error( "server.lua, [", addr, "]:", port, ": ", err )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   767
		return nil, err
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   768
	end
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   769
	local handler, err = wrapserver( listeners, server, addr, port, pattern, sslctx ) -- wrap new server socket
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   770
	if not handler then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   771
		server:close( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   772
		return nil, err
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   773
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   774
	server:settimeout( 0 )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   775
	_readlistlen = addsocket(_readlist, server, _readlistlen)
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   776
	_server[ addr..":"..port ] = handler
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   777
	_socketlist[ server ] = handler
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   778
	out_put( "server.lua: new "..(sslctx and "ssl " or "").."server listener on '[", addr, "]:", port, "'" )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   779
	return handler
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   780
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   781
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   782
getserver = function ( addr, port )
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   783
	return _server[ addr..":"..port ];
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   784
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   785
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   786
removeserver = function( addr, port )
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   787
	local handler = _server[ addr..":"..port ]
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   788
	if not handler then
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   789
		return nil, "no server found on '[" .. addr .. "]:" .. tostring( port ) .. "'"
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   790
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   791
	handler:close( )
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   792
	_server[ addr..":"..port ] = nil
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   793
	return true
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   794
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   795
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   796
closeall = function( )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   797
	for _, handler in pairs( _socketlist ) do
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   798
		handler:close( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   799
		_socketlist[ _ ] = nil
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   800
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   801
	_readlistlen = 0
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   802
	_sendlistlen = 0
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   803
	_timerlistlen = 0
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   804
	_server = { }
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   805
	_readlist = { }
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   806
	_sendlist = { }
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   807
	_timerlist = { }
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   808
	_socketlist = { }
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   809
	--mem_free( )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   810
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   811
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   812
getsettings = function( )
5385
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   813
	return {
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   814
		select_timeout = _selecttimeout;
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5492
diff changeset
   815
		tcp_backlog = _tcpbacklog;
5385
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   816
		max_send_buffer_size = _maxsendlen;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   817
		max_receive_buffer_size = _maxreadlen;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   818
		select_idle_check_interval = _checkinterval;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   819
		send_timeout = _sendtimeout;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   820
		read_timeout = _readtimeout;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   821
		max_connections = _maxselectlen;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   822
		max_ssl_handshake_roundtrips = _maxsslhandshake;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   823
		highest_allowed_fd = _maxfd;
7098
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   824
		accept_retry_interval = _accepretry;
5385
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   825
	}
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   826
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   827
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   828
changesettings = function( new )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   829
	if type( new ) ~= "table" then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   830
		return nil, "invalid settings table"
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   831
	end
5197
beffe931b3b6 net.server_select: Better names for config options (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 4983
diff changeset
   832
	_selecttimeout = tonumber( new.select_timeout ) or _selecttimeout
beffe931b3b6 net.server_select: Better names for config options (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 4983
diff changeset
   833
	_maxsendlen = tonumber( new.max_send_buffer_size ) or _maxsendlen
beffe931b3b6 net.server_select: Better names for config options (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 4983
diff changeset
   834
	_maxreadlen = tonumber( new.max_receive_buffer_size ) or _maxreadlen
beffe931b3b6 net.server_select: Better names for config options (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 4983
diff changeset
   835
	_checkinterval = tonumber( new.select_idle_check_interval ) or _checkinterval
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5492
diff changeset
   836
	_tcpbacklog = tonumber( new.tcp_backlog ) or _tcpbacklog
5197
beffe931b3b6 net.server_select: Better names for config options (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 4983
diff changeset
   837
	_sendtimeout = tonumber( new.send_timeout ) or _sendtimeout
beffe931b3b6 net.server_select: Better names for config options (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 4983
diff changeset
   838
	_readtimeout = tonumber( new.read_timeout ) or _readtimeout
7098
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   839
	_accepretry = tonumber( new.accept_retry_interval ) or _accepretry
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   840
	_maxselectlen = new.max_connections or _maxselectlen
5197
beffe931b3b6 net.server_select: Better names for config options (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 4983
diff changeset
   841
	_maxsslhandshake = new.max_ssl_handshake_roundtrips or _maxsslhandshake
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   842
	_maxfd = new.highest_allowed_fd or _maxfd
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   843
	return true
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   844
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   845
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   846
addtimer = function( listener )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   847
	if type( listener ) ~= "function" then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   848
		return nil, "invalid listener function"
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   849
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   850
	_timerlistlen = _timerlistlen + 1
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   851
	_timerlist[ _timerlistlen ] = listener
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   852
	return true
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   853
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   854
6484
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   855
local add_task do
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   856
	local data = {};
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   857
	local new_data = {};
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   858
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   859
	function add_task(delay, callback)
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   860
		local current_time = luasocket_gettime();
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   861
		delay = delay + current_time;
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   862
		if delay >= current_time then
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   863
			table_insert(new_data, {delay, callback});
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   864
		else
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   865
			local r = callback(current_time);
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   866
			if r and type(r) == "number" then
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   867
				return add_task(r, callback);
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   868
			end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   869
		end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   870
	end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   871
6543
31a8b3bfb31d net.server_select: In add_task timer callback, use passed in time rather than re-fetching
daurnimator <quae@daurnimator.com>
parents: 6542
diff changeset
   872
	addtimer(function(current_time)
6484
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   873
		if #new_data > 0 then
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   874
			for _, d in pairs(new_data) do
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   875
				table_insert(data, d);
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   876
			end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   877
			new_data = {};
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   878
		end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   879
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   880
		local next_time = math_huge;
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   881
		for i, d in pairs(data) do
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   882
			local t, callback = d[1], d[2];
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   883
			if t <= current_time then
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   884
				data[i] = nil;
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   885
				local r = callback(current_time);
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   886
				if type(r) == "number" then
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   887
					add_task(r, callback);
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   888
					next_time = math_min(next_time, r);
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   889
				end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   890
			else
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   891
				next_time = math_min(next_time, t - current_time);
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   892
			end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   893
		end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   894
		return next_time;
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   895
	end);
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   896
end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
   897
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   898
stats = function( )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   899
	return _readtraffic, _sendtraffic, _readlistlen, _sendlistlen, _timerlistlen
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   900
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   901
3491
e8c06d20a18b net.server_select: Add server.step() to run through a single iteration of the event loop
Matthew Wild <mwild1@gmail.com>
parents: 3458
diff changeset
   902
local quitting;
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   903
4399
1b4161970842 net.server_event, net.server_select: Fixed some global pollution.
Waqas Hussain <waqas20@gmail.com>
parents: 4393
diff changeset
   904
local function setquitting(quit)
8752
fb3cd6b2263b net.server_select: Allow setquitting("once") to allow resuming the loop later
Matthew Wild <mwild1@gmail.com>
parents: 8731
diff changeset
   905
	quitting = quit;
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   906
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   907
3491
e8c06d20a18b net.server_select: Add server.step() to run through a single iteration of the event loop
Matthew Wild <mwild1@gmail.com>
parents: 3458
diff changeset
   908
loop = function(once) -- this is the main loop of the program
e8c06d20a18b net.server_select: Add server.step() to run through a single iteration of the event loop
Matthew Wild <mwild1@gmail.com>
parents: 3458
diff changeset
   909
	if quitting then return "quitting"; end
e8c06d20a18b net.server_select: Add server.step() to run through a single iteration of the event loop
Matthew Wild <mwild1@gmail.com>
parents: 3458
diff changeset
   910
	if once then quitting = "once"; end
6542
f923140ee7c5 net.server_select: Fix timers not being fired until another timer fixes (or 1 second passes)
daurnimator <quae@daurnimator.com>
parents: 6484
diff changeset
   911
	_currenttime = luasocket_gettime( )
3491
e8c06d20a18b net.server_select: Add server.step() to run through a single iteration of the event loop
Matthew Wild <mwild1@gmail.com>
parents: 3458
diff changeset
   912
	repeat
6542
f923140ee7c5 net.server_select: Fix timers not being fired until another timer fixes (or 1 second passes)
daurnimator <quae@daurnimator.com>
parents: 6484
diff changeset
   913
		-- Fire timers
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   914
	local next_timer_time = math_huge;
6542
f923140ee7c5 net.server_select: Fix timers not being fired until another timer fixes (or 1 second passes)
daurnimator <quae@daurnimator.com>
parents: 6484
diff changeset
   915
		for i = 1, _timerlistlen do
f923140ee7c5 net.server_select: Fix timers not being fired until another timer fixes (or 1 second passes)
daurnimator <quae@daurnimator.com>
parents: 6484
diff changeset
   916
			local t = _timerlist[ i ]( _currenttime ) -- fire timers
f923140ee7c5 net.server_select: Fix timers not being fired until another timer fixes (or 1 second passes)
daurnimator <quae@daurnimator.com>
parents: 6484
diff changeset
   917
			if t then next_timer_time = math_min(next_timer_time, t); end
f923140ee7c5 net.server_select: Fix timers not being fired until another timer fixes (or 1 second passes)
daurnimator <quae@daurnimator.com>
parents: 6484
diff changeset
   918
		end
f923140ee7c5 net.server_select: Fix timers not being fired until another timer fixes (or 1 second passes)
daurnimator <quae@daurnimator.com>
parents: 6484
diff changeset
   919
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   920
		local read, write, err = socket_select( _readlist, _sendlist, math_min(_selecttimeout, next_timer_time) )
8531
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   921
		for _, socket in ipairs( read ) do -- receive data
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   922
			local handler = _socketlist[ socket ]
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   923
			if handler then
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   924
				handler.readbuffer( )
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   925
			else
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   926
				closesocket( socket )
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   927
				out_put "server.lua: found no handler and closed socket (readlist)" -- this can happen
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   928
			end
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   929
		end
7471
2d38a2519d09 net.server_select: remove unused one-letter loop variables [luacheck]
Anton Shestakov <av6@dwimlabs.net>
parents: 7326
diff changeset
   930
		for _, socket in ipairs( write ) do -- send data waiting in writequeues
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   931
			local handler = _socketlist[ socket ]
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   932
			if handler then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   933
				handler.sendbuffer( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   934
			else
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   935
				closesocket( socket )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   936
				out_put "server.lua: found no handler and closed socket (writelist)"	-- this should not happen
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   937
			end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   938
		end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   939
		for handler, err in pairs( _closelist ) do
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   940
			handler.disconnect( )( handler, err )
4962
1d8fb12a9b2d net.server_select, net.server_event: Change semantics of conn:close() - always call ondisconnect (with err == nil), and never close with data in send buffer (i.e. 'now' parameter removed)
Matthew Wild <mwild1@gmail.com>
parents: 4904
diff changeset
   941
			handler:force_close()	 -- forced disconnect
5338
3df649ec43ea net.server_select: Optimization, clean bufferqueue when it makes sense.
Kim Alvefur <zash@zash.se>
parents: 5337
diff changeset
   942
			_closelist[ handler ] = nil;
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   943
		end
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   944
		_currenttime = luasocket_gettime( )
5485
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   945
5486
bcf27dbef6c6 net.server_select: Add and improve some comments.
Waqas Hussain <waqas20@gmail.com>
parents: 5485
diff changeset
   946
		-- Check for socket timeouts
7326
a1570219b865 net.server_select: Remove do-nothing os_difftime calls [backported from trunk]
daurnimator <quae@daurnimator.com>
parents: 7101
diff changeset
   947
		if _currenttime - _starttime > _checkinterval then
5485
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   948
			_starttime = _currenttime
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   949
			for handler, timestamp in pairs( _writetimes ) do
7326
a1570219b865 net.server_select: Remove do-nothing os_difftime calls [backported from trunk]
daurnimator <quae@daurnimator.com>
parents: 7101
diff changeset
   950
				if _currenttime - timestamp > _sendtimeout then
5485
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   951
					handler.disconnect( )( handler, "send timeout" )
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   952
					handler:force_close()	 -- forced disconnect
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   953
				end
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   954
			end
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   955
			for handler, timestamp in pairs( _readtimes ) do
7326
a1570219b865 net.server_select: Remove do-nothing os_difftime calls [backported from trunk]
daurnimator <quae@daurnimator.com>
parents: 7101
diff changeset
   956
				if _currenttime - timestamp > _readtimeout then
5632
8a2456f1f117 net.server_select: Support for listener.onreadtimeout() [see also e67891ad18d6]
Matthew Wild <mwild1@gmail.com>
parents: 5548
diff changeset
   957
					if not(handler.onreadtimeout) or handler:onreadtimeout() ~= true then
8a2456f1f117 net.server_select: Support for listener.onreadtimeout() [see also e67891ad18d6]
Matthew Wild <mwild1@gmail.com>
parents: 5548
diff changeset
   958
						handler.disconnect( )( handler, "read timeout" )
8a2456f1f117 net.server_select: Support for listener.onreadtimeout() [see also e67891ad18d6]
Matthew Wild <mwild1@gmail.com>
parents: 5548
diff changeset
   959
						handler:close( )	-- forced disconnect?
6462
ba421af3dfd3 net.server_select: Reset read timeout timer if the event is handled
Kim Alvefur <zash@zash.se>
parents: 6436
diff changeset
   960
					else
ba421af3dfd3 net.server_select: Reset read timeout timer if the event is handled
Kim Alvefur <zash@zash.se>
parents: 6436
diff changeset
   961
						_readtimes[ handler ] = _currenttime -- reset timer
5632
8a2456f1f117 net.server_select: Support for listener.onreadtimeout() [see also e67891ad18d6]
Matthew Wild <mwild1@gmail.com>
parents: 5548
diff changeset
   962
					end
5485
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   963
				end
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   964
			end
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   965
		end
5147eed0a42e net.server_select: Move socket timeout cleanup code out of a timer, into the select loop (which makes util.timer the only timer using server_select._addtimer).
Waqas Hussain <waqas20@gmail.com>
parents: 5484
diff changeset
   966
7098
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   967
		for server, paused_time in pairs( _fullservers ) do
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   968
			if _currenttime - paused_time > _accepretry then
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   969
				_fullservers[ server ] = nil;
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   970
				server.resume();
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   971
			end
3e1dac35af87 server_select: Retry accepting clients from full servers after 10s (matches libevent behaviour)
Kim Alvefur <zash@zash.se>
parents: 7097
diff changeset
   972
		end
3491
e8c06d20a18b net.server_select: Add server.step() to run through a single iteration of the event loop
Matthew Wild <mwild1@gmail.com>
parents: 3458
diff changeset
   973
	until quitting;
8752
fb3cd6b2263b net.server_select: Allow setquitting("once") to allow resuming the loop later
Matthew Wild <mwild1@gmail.com>
parents: 8731
diff changeset
   974
	if quitting == "once" then quitting = nil; return; end
7044
aff786e7b4ce net.server_select: Close all connections when quitting (and not just stepping), matches server_event
Matthew Wild <mwild1@gmail.com>
parents: 6822
diff changeset
   975
	closeall();
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   976
	return "quitting"
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   977
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   978
4399
1b4161970842 net.server_event, net.server_select: Fixed some global pollution.
Waqas Hussain <waqas20@gmail.com>
parents: 4393
diff changeset
   979
local function step()
3491
e8c06d20a18b net.server_select: Add server.step() to run through a single iteration of the event loop
Matthew Wild <mwild1@gmail.com>
parents: 3458
diff changeset
   980
	return loop(true);
e8c06d20a18b net.server_select: Add server.step() to run through a single iteration of the event loop
Matthew Wild <mwild1@gmail.com>
parents: 3458
diff changeset
   981
end
e8c06d20a18b net.server_select: Add server.step() to run through a single iteration of the event loop
Matthew Wild <mwild1@gmail.com>
parents: 3458
diff changeset
   982
2339
b04014f42fce net.server_select: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
   983
local function get_backend()
b04014f42fce net.server_select: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
   984
	return "select";
b04014f42fce net.server_select: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
   985
end
b04014f42fce net.server_select: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
   986
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   987
--// EXPERIMENTAL //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   988
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   989
local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx, extra )
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
   990
	local handler, socket, err = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx, extra)
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   991
	if not handler then return nil, err end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   992
	_socketlist[ socket ] = handler
4349
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   993
	if not sslctx then
8531
67311cda0625 net.server_select: Better detection of errors for outgoing connections
Matthew Wild <mwild1@gmail.com>
parents: 7748
diff changeset
   994
		_readlistlen = addsocket(_readlist, socket, _readlistlen)
4349
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   995
		_sendlistlen = addsocket(_sendlist, socket, _sendlistlen)
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   996
		if listeners.onconnect then
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   997
			-- When socket is writeable, call onconnect
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   998
			local _sendbuffer = handler.sendbuffer;
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   999
			handler.sendbuffer = function ()
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
  1000
				handler.sendbuffer = _sendbuffer;
16fd8061964e net.server_select: Merge straight-SSL and starttls code paths, also fixes onconnect being called before handshake completion for straight-SSL
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
  1001
				listeners.onconnect(handler);
5949
a9abbdeddbf3 net.server_select: Don't remove the socket from sendlist when we might have data in the buffer (we'll now let sendbuffer() take care of that) (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 5663
diff changeset
  1002
				return _sendbuffer(); -- Send any queued outgoing data
3382
fea0f8e19e4c net.server_select: Ensure that onconnect is called for server sockets as well as clients, rather than onincoming. Fixes mod_console traceback, issue #197
Matthew Wild <mwild1@gmail.com>
parents: 3312
diff changeset
  1003
			end
fea0f8e19e4c net.server_select: Ensure that onconnect is called for server sockets as well as clients, rather than onincoming. Fixes mod_console traceback, issue #197
Matthew Wild <mwild1@gmail.com>
parents: 3312
diff changeset
  1004
		end
fea0f8e19e4c net.server_select: Ensure that onconnect is called for server sockets as well as clients, rather than onincoming. Fixes mod_console traceback, issue #197
Matthew Wild <mwild1@gmail.com>
parents: 3312
diff changeset
  1005
	end
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1006
	return handler, socket
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1007
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1008
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
  1009
local addclient = function( address, port, listeners, pattern, sslctx, typ, extra )
6817
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1010
	local err
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1011
	if type( listeners ) ~= "table" then
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1012
		err = "invalid listener table"
6818
46546d57f639 net/server_select: Fix typo
daurnimator <quae@daurnimator.com>
parents: 6817
diff changeset
  1013
	elseif type ( address ) ~= "string" then
6817
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1014
		err = "invalid address"
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1015
	elseif type( port ) ~= "number" or not ( port >= 0 and port <= 65535 ) then
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1016
		err = "invalid port"
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1017
	elseif sslctx and not has_luasec then
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1018
		err = "luasec not found"
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1019
	end
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
  1020
	if not typ then
9638
f457edaab510 net.server_select: Fix IP validation to use correct variable (thanks quest)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
  1021
		local n = inet_pton(address);
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
  1022
		if not n then return nil, "invalid-ip"; end
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
  1023
		if #n == 16 then
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
  1024
			typ = "tcp6";
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
  1025
		elseif #n == 4 then
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
  1026
			typ = "tcp4";
6822
ffb2b5e31456 net.server_{select,event}: addclient: Use getaddrinfo to detect IP address type if no socket type argument given. (Argument must be given for non-TCP)
Kim Alvefur <zash@zash.se>
parents: 6821
diff changeset
  1027
		end
6821
ae9d1289a868 net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 6818
diff changeset
  1028
	end
9498
89e05b118f6e net.server: Remove socket constructor fallback
Kim Alvefur <zash@zash.se>
parents: 9476
diff changeset
  1029
	local create = luasocket[typ];
6821
ae9d1289a868 net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 6818
diff changeset
  1030
	if type( create ) ~= "function"  then
ae9d1289a868 net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 6818
diff changeset
  1031
		err = "invalid socket type"
ae9d1289a868 net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 6818
diff changeset
  1032
	end
6822
ffb2b5e31456 net.server_{select,event}: addclient: Use getaddrinfo to detect IP address type if no socket type argument given. (Argument must be given for non-TCP)
Kim Alvefur <zash@zash.se>
parents: 6821
diff changeset
  1033
6817
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1034
	if err then
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1035
		out_error( "server.lua, addclient: ", err )
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1036
		return nil, err
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1037
	end
936f969bf783 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 6816
diff changeset
  1038
6821
ae9d1289a868 net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 6818
diff changeset
  1039
	local client, err = create( )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1040
	if err then
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1041
		return nil, err
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1042
	end
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1043
	client:settimeout( 0 )
9502
36e379f058c8 net.server: Swich method for connecting sockets with remotes
Kim Alvefur <zash@zash.se>
parents: 9498
diff changeset
  1044
	local ok, err = client:setpeername( address, port )
6286
ec6e8d5a3fd3 net/server_*: Fix addclient: LuaSocket 3.0-rc1 sometimes returns EALREADY instead of EINPROGRESS when the dns lookup has multiple results
daurnimator <quae@daurnimator.com>
parents: 6055
diff changeset
  1045
	if ok or err == "timeout" or err == "Operation already in progress" then
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9638
diff changeset
  1046
		return wrapclient( client, address, port, listeners, pattern, sslctx, extra )
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1047
	else
6816
b1615fa62e59 net/server_select: addclient: Check for failure correctly; remove wrapconnection call on failure
daurnimator <quae@daurnimator.com>
parents: 6815
diff changeset
  1048
		return nil, err
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1049
	end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1050
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1051
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1052
local closewatcher = function (handler)
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1053
	local socket = handler.conn;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1054
	_sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1055
	_readlistlen = removesocket( _readlist, socket, _readlistlen )
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1056
	_socketlist[ socket ] = nil
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1057
end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1058
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1059
local addremove = function (handler, read, send)
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1060
	local socket = handler.conn
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1061
	_socketlist[ socket ] = handler
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1062
	if read ~= nil then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1063
		if read then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1064
			_readlistlen = addsocket( _readlist, socket, _readlistlen )
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1065
		else
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1066
			_sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1067
		end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1068
	end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1069
	if send ~= nil then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1070
		if send then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1071
			_sendlistlen = addsocket( _sendlist, socket, _sendlistlen )
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1072
		else
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1073
			_readlistlen = removesocket( _readlist, socket, _readlistlen )
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1074
		end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1075
	end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1076
end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1077
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1078
local watchfd = function ( fd, onreadable, onwriteable )
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1079
	local socket = fd
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1080
	if type(fd) == "number" then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1081
		socket = { getfd = function () return fd; end }
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1082
	end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1083
	local handler = {
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1084
		conn = socket;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1085
		readbuffer = onreadable or id;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1086
		sendbuffer = onwriteable or id;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1087
		close = closewatcher;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1088
		setflags = addremove;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1089
	};
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1090
	addremove( handler, onreadable, onwriteable )
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1091
	return handler
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1092
end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1093
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1094
----------------------------------// BEGIN //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1095
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1096
use "setmetatable" ( _socketlist, { __mode = "k" } )
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1097
use "setmetatable" ( _readtimes, { __mode = "k" } )
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1098
use "setmetatable" ( _writetimes, { __mode = "k" } )
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1099
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
  1100
_starttime = luasocket_gettime( )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1101
2424
7d3b071e3b5b net.server_select: Fix oops in last commit
Matthew Wild <mwild1@gmail.com>
parents: 2423
diff changeset
  1102
local function setlogger(new_logger)
2423
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
  1103
	local old_logger = log;
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
  1104
	if new_logger then
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
  1105
		log = new_logger;
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
  1106
	end
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
  1107
	return old_logger;
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
  1108
end
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
  1109
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1110
----------------------------------// PUBLIC INTERFACE //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1111
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1112
return {
4808
07d0a3a75c8a net.server, net.timer, net.server_select: Rearrange dependencies between these three modules. server.addtimer() is no longer a public function (renamed to _addtimer) and is not available at all from server_event (compat code removed to prevent traceback) (thanks Nulani)
Matthew Wild <mwild1@gmail.com>
parents: 4675
diff changeset
  1113
	_addtimer = addtimer,
6484
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6468
diff changeset
  1114
	add_task = add_task;
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1115
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1116
	addclient = addclient,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1117
	wrapclient = wrapclient,
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8752
diff changeset
  1118
	watchfd = watchfd,
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5664
diff changeset
  1119
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1120
	loop = loop,
3003
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
  1121
	link = link,
4145
e992650185c8 net.server_select: Expose step() function (thanks Ɓukasz)
Matthew Wild <mwild1@gmail.com>
parents: 4111
diff changeset
  1122
	step = step,
2581
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1123
	stats = stats,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1124
	closeall = closeall,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1125
	addserver = addserver,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1126
	getserver = getserver,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1127
	setlogger = setlogger,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1128
	getsettings = getsettings,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1129
	setquitting = setquitting,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1130
	removeserver = removeserver,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1131
	get_backend = get_backend,
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
  1132
	changesettings = changesettings,
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
  1133
}