net/server_select.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 02 Apr 2014 17:42:22 +0100
changeset 6055 596539a30e9b
parent 5967 3b7206981317
parent 6054 7a5ddbaf758d
child 6286 ec6e8d5a3fd3
permissions -rw-r--r--
Merge 0.10->trunk
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 os = use "os"
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 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
    36
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
    37
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
    38
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    39
--// 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
    40
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    41
local os_difftime = os.difftime
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
    42
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
    43
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
    44
local table_concat = 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
    45
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
    46
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
    47
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
    48
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    49
--// 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
    50
5956
59997f3f5502 net/server_select: pcall require ssl (easy to forget to require ssl)
daurnimator <quae@daurnimator.com>
parents: 5950
diff changeset
    51
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
    52
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
    53
local luasocket_gettime = luasocket.gettime
5966
958ad646c0f2 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: 5965
diff changeset
    54
local getaddrinfo = luasocket.dns.getaddrinfo
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
5956
59997f3f5502 net/server_select: pcall require ssl (easy to forget to require ssl)
daurnimator <quae@daurnimator.com>
parents: 5950
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_sleep = luasocket.sleep
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    61
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
    62
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    63
--// functions //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    64
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 id
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 loop
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 stats
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 idfalse
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    69
local closeall
3686
27d3e2a2a248 net.server_select: Made another global local.
Waqas Hussain <waqas20@gmail.com>
parents: 3685
diff changeset
    70
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
    71
local addserver
5288
2777f34adbd3 net.server_select: Fix global access
Kim Alvefur <zash@zash.se>
parents: 5280
diff changeset
    72
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
    73
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
    74
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
    75
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
    76
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
    77
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
    78
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
    79
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
    80
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
    81
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    82
--// tables //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    83
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 _server
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 _readlist
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 _timerlist
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 _sendlist
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 _socketlist
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 _closelist
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 _readtimes
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
    91
local _writetimes
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
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   104
local _sleeptime
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5492
diff changeset
   105
local _tcpbacklog
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
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   117
local _timer
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   118
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   119
local _maxselectlen
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   120
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
   121
3685
63efe4eefa07 net.server_select: Made some globals local.
Waqas Hussain <waqas20@gmail.com>
parents: 3682
diff changeset
   122
local _maxsslhandshake
63efe4eefa07 net.server_select: Made some globals local.
Waqas Hussain <waqas20@gmail.com>
parents: 3682
diff changeset
   123
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   124
----------------------------------// DEFINITION //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   125
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
   126
_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
   127
_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
   128
_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
   129
_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
   130
_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
   131
_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
   132
_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
   133
_closelist = { } -- handlers to close
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   134
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
   135
_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
   136
_sendlistlen = 0 -- length of 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
   137
_timerlistlen = 0 -- lenght 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
   138
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
   139
_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
   140
_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
   141
3775
f3f2a7810108 net/server_select.lua: Reduce select() timeout back to 1s
Matthew Wild <mwild1@gmail.com>
parents: 3687
diff changeset
   142
_selecttimeout = 1 -- timeout of socket.select
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
   143
_sleeptime = 0 -- time to wait at the end of every loop
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5492
diff changeset
   144
_tcpbacklog = 128 -- some kind of hint to the OS
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   145
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
   146
_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
   147
_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
   148
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
   149
_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
   150
_sendtimeout = 60000 -- allowed send idle time in secs
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   151
_readtimeout = 6 * 60 * 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
   152
5548
c5d1c35c93f4 net.server_select: Don't limit max file descriptor number on Windows.
Waqas Hussain <waqas20@gmail.com>
parents: 5531
diff changeset
   153
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
   154
_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
   155
_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
   156
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   157
_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
   158
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   159
----------------------------------// PRIVATE //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   160
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   161
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
   162
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   163
	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
   164
		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
   165
		socket:close()
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   166
		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
   167
	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
   168
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
   169
	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
   170
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
   171
	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
   172
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
   173
	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
   174
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
   175
	--// 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
   176
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
   177
	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
   178
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
   179
	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
   180
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
   181
	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
   182
		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
   183
	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
   184
	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
   185
		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
   186
	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
   187
	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
   188
		connections = connections - 1
5280
1514a6147e85 net.server_select: Pause servers while they are full
Kim Alvefur <zash@zash.se>
parents: 5279
diff changeset
   189
		if handler then
1514a6147e85 net.server_select: Pause servers while they are full
Kim Alvefur <zash@zash.se>
parents: 5279
diff changeset
   190
			handler.resume( )
1514a6147e85 net.server_select: Pause servers while they are full
Kim Alvefur <zash@zash.se>
parents: 5279
diff changeset
   191
		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
   192
	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
   193
	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
   194
		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
   195
		_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
   196
		_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
   197
		_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
   198
		_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
   199
		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
   200
		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
   201
		--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
   202
		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
   203
	end
5330
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   204
	handler.pause = function( hard )
5279
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   205
		if not handler.paused then
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   206
			_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
   207
			if hard then
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   208
				_socketlist[ socket ] = nil
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   209
				socket:close( )
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   210
				socket = nil;
0a0ca2eb991b net.server_select: Be less aggressive about server pause
Kim Alvefur <zash@zash.se>
parents: 5289
diff changeset
   211
			end
5279
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   212
			handler.paused = true;
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
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   223
			handler.paused = false;
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   224
		end
e8f7962056f5 net.server_select: Add pause and resume methods
Kim Alvefur <zash@zash.se>
parents: 5197
diff changeset
   225
	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
   226
	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
   227
		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
   228
	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
   229
	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
   230
		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
   231
	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
   232
	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
   233
		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
   234
	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
   235
	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
   236
		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
   237
			handler.pause( )
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
   238
			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
   239
			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
   240
		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
   241
		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
   242
		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
   243
			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
   244
			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
   245
			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
   246
				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
   247
			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
   248
			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
   249
			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
   250
			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
   251
				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
   252
			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
   253
			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
   254
		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
   255
			out_put( "server.lua: error with new client connection: ", tostring(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
   256
			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
   257
		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
   258
	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
   259
	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
   260
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   261
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
   262
wrapconnection = function( server, listeners, socket, ip, serverport, clientport, pattern, sslctx ) -- 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
   263
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   264
	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
   265
		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
   266
		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
   267
		if server then
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
   268
			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
   269
		end
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   270
		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
   271
	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
   272
	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
   273
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
   274
	--// 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
   275
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
   276
	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
   277
	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
   278
	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
   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
	--// 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
   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 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
   283
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
   284
	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
   285
	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
   286
	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
   287
	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
   288
	local onreadtimeout = listeners.onreadtimeout;
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 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
   291
	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
   292
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
   293
	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
   294
	local fatalerror
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   295
	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
   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 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
   298
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
   299
	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
   300
	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
   301
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
   302
	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
   303
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
   304
	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
   305
	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
   306
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
   307
	--// 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
   308
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
   309
	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
   310
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
   311
	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
   312
		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
   313
	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
   314
	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
   315
		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
   316
	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
   317
	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
   318
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
   319
	handler.setlistener = function( self, listeners )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   320
		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
   321
		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
   322
		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
   323
		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
   324
		handler.onreadtimeout = listeners.onreadtimeout
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
   325
	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
   326
	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
   327
		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
   328
	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
   329
	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
   330
		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
   331
	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
   332
	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
   333
		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
   334
	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
   335
	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
   336
		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
   337
	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
   338
	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
   339
		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
   340
	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
   341
	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
   342
		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
   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.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
   345
		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
   346
			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
   347
		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
   348
		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
   349
	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
   350
	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
   351
		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
   352
			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
   353
			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
   354
		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
   355
		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
   356
	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
   357
	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
   358
		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
   359
		_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
   360
		_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
   361
		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
   362
			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
   363
			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
   364
				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
   365
					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
   366
				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
   367
				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
   368
				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
   369
			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
   370
		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
   371
		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
   372
			_ = 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
   373
			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
   374
			_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
   375
			_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
   376
			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
   377
		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
   378
			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
   379
		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
   380
		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
   381
			_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
   382
			_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
   383
			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
   384
			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
   385
			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
   386
				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
   387
				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
   388
			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
   389
		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
   390
		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
   391
			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
   392
		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
   393
		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
   394
		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
   395
	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
   396
	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
   397
		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
   398
	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
   399
	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
   400
		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
   401
	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
   402
	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
   403
		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
   404
	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
   405
	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
   406
	local write = function( self, data )
5337
c22dd451487f net.server_select: Use # operator instead of string.len
Kim Alvefur <zash@zash.se>
parents: 5331
diff changeset
   407
		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
   408
		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
   409
			_closelist[ handler ] = "send buffer exceeded"	 -- cannot close the client at the moment, have to wait to the end of the cycle
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   410
			handler.write = idfalse -- dont write anymore
1b9f424e695e net.server_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
			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
   412
		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
   413
			_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
   414
		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
   415
		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
   416
		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
   417
		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
   418
			_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
   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
		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
   421
	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
   422
	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
   423
	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
   424
		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
   425
	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
   426
	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
   427
		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
   428
	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
   429
	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
   430
		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
   431
		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
   432
	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
   433
	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
   434
		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
   435
		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
   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
	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
   438
		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
   439
		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
   440
		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
   441
	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
   442
	--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
   443
	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
   444
		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
   445
			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
   446
			_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
   447
			_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
   448
			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
   449
				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
   450
			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
   451
		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
   452
			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
   453
				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
   454
				_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
   455
				_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
   456
			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
   457
		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
   458
		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
   459
	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
   460
	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
   461
		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
   462
	end
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2970
diff changeset
   463
	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
   464
		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
   465
	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
   466
	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
   467
		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
   468
		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
   469
			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
   470
			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
   471
			_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
   472
			_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
   473
			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
   474
				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
   475
			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
   476
		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
   477
			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
   478
			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
   479
				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
   480
				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
   481
			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
   482
		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
   483
		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
   484
	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
   485
	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
   486
		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
   487
		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
   488
			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
   489
			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
   490
			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
   491
				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
   492
				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
   493
			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
   494
			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
   495
			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
   496
			_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
   497
			_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
   498
			--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
   499
			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
   500
		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
   501
			out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " read error: ", tostring(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
   502
			fatalerror = true
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
   503
			_ = 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
   504
			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
   505
		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
   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 _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
   508
		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
   509
		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
   510
			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
   511
			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
   512
			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
   513
			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
   514
			_sendtraffic = _sendtraffic + count
5338
3df649ec43ea net.server_select: Optimization, clean bufferqueue when it makes sense.
Kim Alvefur <zash@zash.se>
parents: 5337
diff changeset
   515
			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
   516
				bufferqueue[ i ] = nil
3df649ec43ea net.server_select: Optimization, clean bufferqueue when it makes sense.
Kim Alvefur <zash@zash.se>
parents: 5337
diff changeset
   517
			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
   518
			--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
   519
		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
   520
			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
   521
		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
   522
		if succ then	-- sending succesful
1b9f424e695e net.server_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
			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
   524
			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
   525
			_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
   526
			_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
   527
			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
   528
				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
   529
			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
   530
			_ = 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
   531
			_ = 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
   532
			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
   533
		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
   534
			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
   535
			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
   536
			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
   537
			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
   538
			_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
   539
			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
   540
		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
   541
			out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " write error: ", tostring(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
   542
			fatalerror = true
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
   543
			_ = 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
   544
			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
   545
		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
   546
	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
   547
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
   548
	-- 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
   549
	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
   550
	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
   551
		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
   552
		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
   553
		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
   554
				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
   555
				for i = 1, _maxsslhandshake 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
   556
					_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
   557
					_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
   558
					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
   559
					_, 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
   560
					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
   561
						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
   562
						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
   563
						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
   564
						_ = status and status( handler, "ssl-handshake-complete" )
5490
ab821566ede8 Backed out changeset f2631a14b953
Matthew Wild <mwild1@gmail.com>
parents: 5482
diff changeset
   565
						if self.autostart_ssl and listeners.onconnect then
ab821566ede8 Backed out changeset f2631a14b953
Matthew Wild <mwild1@gmail.com>
parents: 5482
diff changeset
   566
							listeners.onconnect(self);
ab821566ede8 Backed out changeset f2631a14b953
Matthew Wild <mwild1@gmail.com>
parents: 5482
diff changeset
   567
						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
   568
						_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
   569
						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
   570
					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
   571
						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
   572
							_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
   573
							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
   574
						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
   575
							_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
   576
							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
   577
						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
   578
							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
   579
						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
   580
						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
   581
						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
   582
					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
   583
				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
   584
				out_put( "server.lua: ssl handshake error: ", tostring(err or "handshake too long") )
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
   585
				_ = handler and handler:force_close("ssl handshake failed")
5484
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   586
				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
   587
			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
   588
		)
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   589
	end
5956
59997f3f5502 net/server_select: pcall require ssl (easy to forget to require ssl)
daurnimator <quae@daurnimator.com>
parents: 5950
diff changeset
   590
	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
   591
		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
   592
			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
   593
				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
   594
			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
   595
			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
   596
				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
   597
				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
   598
				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
   599
			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
   600
			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
   601
			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
   602
			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
   603
			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
   604
				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
   605
				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
   606
			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
   607
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
   608
			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
   609
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
   610
			-- 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
   611
			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
   612
			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
   613
			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
   614
			_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
   615
			_readlistlen = addsocket(_readlist, socket, _readlistlen)
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5664
diff changeset
   616
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
   617
			-- 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
   618
			_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
   619
			_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
   620
			_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
   621
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
			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
   623
			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
   624
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
			-- 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
   626
			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
   627
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
   628
			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
   629
			handler.sendbuffer = handshake
5484
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   630
			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
   631
		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
   632
	end
2582
d6afb6d919df net.server_select: Only allow starttls if luasec is available (thanks Nolan)
Matthew Wild <mwild1@gmail.com>
parents: 2581
diff changeset
   633
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
   634
	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
   635
	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
   636
	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
   637
	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
   638
	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
   639
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
   640
	_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
   641
	_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
   642
5956
59997f3f5502 net/server_select: pcall require ssl (easy to forget to require ssl)
daurnimator <quae@daurnimator.com>
parents: 5950
diff changeset
   643
	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
   644
		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
   645
		handler.autostart_ssl = true;
5484
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   646
		local ok, err = handler:starttls(sslctx);
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   647
		if ok == false then
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   648
			return nil, nil, err
17ce73907c48 net.server_select: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 5482
diff changeset
   649
		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
   650
	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
   651
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
   652
	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
   653
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   654
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   655
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
   656
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   657
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   658
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
   659
	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
   660
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   661
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   662
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
   663
	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
   664
		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
   665
		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
   666
		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
   667
	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
   668
	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
   669
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   670
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
   671
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
   672
	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
   673
	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
   674
		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
   675
		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
   676
		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
   677
		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
   678
			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
   679
			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
   680
		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
   681
		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
   682
	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
   683
	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
   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
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
   687
	_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
   688
	_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
   689
	_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
   690
	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
   691
	--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
   692
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   693
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
   694
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
   695
	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
   696
	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
   697
	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
   698
		_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
   699
		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
   700
			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
   701
			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
   702
		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
   703
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5664
diff changeset
   704
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
   705
	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
   706
	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
   707
		_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
   708
		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
   709
			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
   710
			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
   711
		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
   712
	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
   713
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
   714
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   715
----------------------------------// PUBLIC //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   716
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
   717
addserver = function( addr, port, listeners, pattern, sslctx ) -- this function provides a way for other scripts to reg a server
5957
3c5061d937dd net/server_select: Check arguments to add_server correctly
daurnimator <quae@daurnimator.com>
parents: 5956
diff changeset
   718
	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
   719
	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
   720
	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
   721
		err = "invalid listener table"
5957
3c5061d937dd net/server_select: Check arguments to add_server correctly
daurnimator <quae@daurnimator.com>
parents: 5956
diff changeset
   722
	elseif type ( addr ) ~= "string" then
3c5061d937dd net/server_select: Check arguments to add_server correctly
daurnimator <quae@daurnimator.com>
parents: 5956
diff changeset
   723
		err = "invalid address"
3c5061d937dd net/server_select: Check arguments to add_server correctly
daurnimator <quae@daurnimator.com>
parents: 5956
diff changeset
   724
	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
   725
		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
   726
	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
   727
		err = "listeners on '[" .. addr .. "]:" .. port .. "' already exist"
5956
59997f3f5502 net/server_select: pcall require ssl (easy to forget to require ssl)
daurnimator <quae@daurnimator.com>
parents: 5950
diff changeset
   728
	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
   729
		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
   730
	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
   731
	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
   732
		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
   733
		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
   734
	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
   735
	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
   736
	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
   737
		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
   738
		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
   739
	end
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   740
	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
   741
	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
   742
		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
   743
		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
   744
	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
   745
	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
   746
	_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
   747
	_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
   748
	_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
   749
	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
   750
	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
   751
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   752
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   753
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
   754
	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
   755
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   756
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   757
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
   758
	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
   759
	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
   760
		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
   761
	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
   762
	handler:close( )
4322
aff627b1ce95 connlistener, server_select, prosody: Add support for binding to multiple addresses
Florian Zeitz <florob@babelmonkeys.de>
parents: 4145
diff changeset
   763
	_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
   764
	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
   765
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   766
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   767
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
   768
	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
   769
		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
   770
		_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
   771
	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
   772
	_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
   773
	_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
   774
	_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
   775
	_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
   776
	_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
   777
	_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
   778
	_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
   779
	_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
   780
	--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
   781
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   782
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   783
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
   784
	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
   785
		select_timeout = _selecttimeout;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   786
		select_sleep_time = _sleeptime;
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5492
diff changeset
   787
		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
   788
		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
   789
		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
   790
		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
   791
		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
   792
		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
   793
		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
   794
		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
   795
		highest_allowed_fd = _maxfd;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5338
diff changeset
   796
	}
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   797
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   798
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   799
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
   800
	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
   801
		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
   802
	end
5197
beffe931b3b6 net.server_select: Better names for config options (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 4983
diff changeset
   803
	_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
   804
	_sleeptime = tonumber( new.select_sleep_time ) or _sleeptime
beffe931b3b6 net.server_select: Better names for config options (thanks MattJ)
Kim Alvefur <zash@zash.se>
parents: 4983
diff changeset
   805
	_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
   806
	_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
   807
	_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
   808
	_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
   809
	_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
   810
	_readtimeout = tonumber( new.read_timeout ) or _readtimeout
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   811
	_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
   812
	_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
   813
	_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
   814
	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
   815
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   816
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   817
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
   818
	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
   819
		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
   820
	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
   821
	_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
   822
	_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
   823
	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
   824
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   825
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   826
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
   827
	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
   828
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   829
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
   830
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
   831
4399
1b4161970842 net.server_event, net.server_select: Fixed some global pollution.
Waqas Hussain <waqas20@gmail.com>
parents: 4393
diff changeset
   832
local function setquitting(quit)
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
   833
	quitting = not not 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
   834
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   835
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
   836
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
   837
	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
   838
	if once then quitting = "once"; end
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   839
	local next_timer_time = math_huge;
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
   840
	repeat
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   841
		local read, write, err = socket_select( _readlist, _sendlist, math_min(_selecttimeout, next_timer_time) )
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
   842
		for i, socket in ipairs( write ) do -- send data waiting in writequeues
1b9f424e695e net.server_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
			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
   844
			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
   845
				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
   846
			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
   847
				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
   848
				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
   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
		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
   851
		for i, socket in ipairs( read ) do -- receive 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
   852
			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
   853
			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
   854
				handler.readbuffer( )
1b9f424e695e net.server_select: *Major* whitespace refactoring to meet Prosody's coding style guidelines, we now have tabs
Matthew Wild <mwild1@gmail.com>
parents: 2559
diff changeset
   855
			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
   856
				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
   857
				out_put "server.lua: found no handler and closed socket (readlist)" -- this can 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
   858
			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
   859
		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
   860
		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
   861
			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
   862
			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
   863
			_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
   864
		end
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   865
		_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
   866
5486
bcf27dbef6c6 net.server_select: Add and improve some comments.
Waqas Hussain <waqas20@gmail.com>
parents: 5485
diff changeset
   867
		-- Check for socket timeouts
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
   868
		local difftime = os_difftime( _currenttime - _starttime )
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
   869
		if difftime > _checkinterval then
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
   870
			_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
   871
			for handler, timestamp in pairs( _writetimes ) do
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
   872
				if os_difftime( _currenttime - timestamp ) > _sendtimeout then
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
   873
					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
   874
					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
   875
				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
   876
			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
   877
			for handler, timestamp in pairs( _readtimes ) do
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
   878
				if os_difftime( _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
   879
					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
   880
						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
   881
						handler:close( )	-- forced disconnect?
8a2456f1f117 net.server_select: Support for listener.onreadtimeout() [see also e67891ad18d6]
Matthew Wild <mwild1@gmail.com>
parents: 5548
diff changeset
   882
					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
   883
				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
   884
			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
   885
		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
   886
5486
bcf27dbef6c6 net.server_select: Add and improve some comments.
Waqas Hussain <waqas20@gmail.com>
parents: 5485
diff changeset
   887
		-- Fire timers
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   888
		if _currenttime - _timer >= math_min(next_timer_time, 1) then
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   889
			next_timer_time = math_huge;
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
   890
			for i = 1, _timerlistlen do
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   891
				local t = _timerlist[ i ]( _currenttime ) -- fire timers
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   892
				if t then next_timer_time = math_min(next_timer_time, t); 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
   893
			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
   894
			_timer = _currenttime
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   895
		else
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   896
			next_timer_time = next_timer_time - (_currenttime - _timer);
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
   897
		end
5486
bcf27dbef6c6 net.server_select: Add and improve some comments.
Waqas Hussain <waqas20@gmail.com>
parents: 5485
diff changeset
   898
bcf27dbef6c6 net.server_select: Add and improve some comments.
Waqas Hussain <waqas20@gmail.com>
parents: 5485
diff changeset
   899
		-- wait some time (0 by default)
bcf27dbef6c6 net.server_select: Add and improve some comments.
Waqas Hussain <waqas20@gmail.com>
parents: 5485
diff changeset
   900
		socket_sleep( _sleeptime )
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
   901
	until quitting;
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
	if once and quitting == "once" then quitting = nil; return; 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
   903
	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
   904
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   905
4399
1b4161970842 net.server_event, net.server_select: Fixed some global pollution.
Waqas Hussain <waqas20@gmail.com>
parents: 4393
diff changeset
   906
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
   907
	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
   908
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
   909
2339
b04014f42fce net.server_select: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
   910
local function get_backend()
b04014f42fce net.server_select: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
   911
	return "select";
b04014f42fce net.server_select: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
   912
end
b04014f42fce net.server_select: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
   913
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   914
--// EXPERIMENTAL //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   915
2541
2febd008214e net.server_select: Remove startssl parameter to the client/server creation functions - passing a sslctx now indicates you want to use SSL from the start
Matthew Wild <mwild1@gmail.com>
parents: 2478
diff changeset
   916
local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx )
5331
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   917
	local handler, socket, err = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx )
ffa740b4f08d net.server_select: Limit global number of sockets passed to select.
Kim Alvefur <zash@zash.se>
parents: 5330
diff changeset
   918
	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
   919
	_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
   920
	if not 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
   921
		_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
   922
		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
   923
			-- 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
   924
			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
   925
			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
   926
				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
   927
				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
   928
				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
   929
			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
   930
		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
   931
	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
   932
	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
   933
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   934
5965
99d55f12a26f net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 5961
diff changeset
   935
local addclient = function( address, port, listeners, pattern, sslctx, typ )
5960
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   936
	local err
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   937
	if type( listeners ) ~= "table" then
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   938
		err = "invalid listener table"
5961
5745bb2b6890 net/server_select: Fix typo
daurnimator <quae@daurnimator.com>
parents: 5960
diff changeset
   939
	elseif type ( address ) ~= "string" then
5960
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   940
		err = "invalid address"
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   941
	elseif type( port ) ~= "number" or not ( port >= 0 and port <= 65535 ) then
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   942
		err = "invalid port"
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   943
	elseif sslctx and not has_luasec then
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   944
		err = "luasec not found"
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   945
	end
5967
3b7206981317 net.server_{select,event}: addclient: Handle missing getaddrinfo
Kim Alvefur <zash@zash.se>
parents: 5966
diff changeset
   946
	if getaddrinfo and not typ then
5966
958ad646c0f2 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: 5965
diff changeset
   947
		local addrinfo, err = getaddrinfo(address)
958ad646c0f2 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: 5965
diff changeset
   948
		if not addrinfo then return nil, err end
958ad646c0f2 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: 5965
diff changeset
   949
		if addrinfo[1] and addrinfo[1].family == "inet6" then
958ad646c0f2 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: 5965
diff changeset
   950
			typ = "tcp6"
958ad646c0f2 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: 5965
diff changeset
   951
		end
5965
99d55f12a26f net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 5961
diff changeset
   952
	end
5967
3b7206981317 net.server_{select,event}: addclient: Handle missing getaddrinfo
Kim Alvefur <zash@zash.se>
parents: 5966
diff changeset
   953
	local create = luasocket[typ or "tcp"]
5965
99d55f12a26f net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 5961
diff changeset
   954
	if type( create ) ~= "function"  then
99d55f12a26f net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 5961
diff changeset
   955
		err = "invalid socket type"
99d55f12a26f net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 5961
diff changeset
   956
	end
5966
958ad646c0f2 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: 5965
diff changeset
   957
5960
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   958
	if err then
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   959
		out_error( "server.lua, addclient: ", err )
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   960
		return nil, err
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   961
	end
2a6edd4678c5 net/server_select: addclient: Check arguments
daurnimator <quae@daurnimator.com>
parents: 5959
diff changeset
   962
5965
99d55f12a26f net.server_{select,event}: addclient: Add argument for overriding socket type
Kim Alvefur <zash@zash.se>
parents: 5961
diff changeset
   963
	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
   964
	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
   965
		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
   966
	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
   967
	client:settimeout( 0 )
5959
9e3b15199ec5 net/server_select: addclient: Check for failure correctly; remove wrapconnection call on failure
daurnimator <quae@daurnimator.com>
parents: 5957
diff changeset
   968
	local ok, err = client:connect( address, port )
9e3b15199ec5 net/server_select: addclient: Check for failure correctly; remove wrapconnection call on failure
daurnimator <quae@daurnimator.com>
parents: 5957
diff changeset
   969
	if ok or err == "timeout" then
5824
6f4c8af128e2 net.server_select: Return handler from addclient
Kim Alvefur <zash@zash.se>
parents: 5823
diff changeset
   970
		return wrapclient( client, address, port, listeners, pattern, sslctx )
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
   971
	else
5959
9e3b15199ec5 net/server_select: addclient: Check for failure correctly; remove wrapconnection call on failure
daurnimator <quae@daurnimator.com>
parents: 5957
diff changeset
   972
		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
   973
	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
   974
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   975
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   976
--// EXPERIMENTAL //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   977
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   978
----------------------------------// BEGIN //--
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   979
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   980
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
   981
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
   982
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
   983
3682
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   984
_timer = luasocket_gettime( )
d12141cbbaa0 net.server_select: Make changes required for sub-second timer precision.
Waqas Hussain <waqas20@gmail.com>
parents: 3543
diff changeset
   985
_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
   986
2424
7d3b071e3b5b net.server_select: Fix oops in last commit
Matthew Wild <mwild1@gmail.com>
parents: 2423
diff changeset
   987
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
   988
	local old_logger = log;
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
   989
	if new_logger then
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
   990
		log = new_logger;
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
   991
	end
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
   992
	return old_logger;
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
   993
end
0597c553acf2 net.server_select: Allow setting the logger using server.setlogger
Matthew Wild <mwild1@gmail.com>
parents: 2339
diff changeset
   994
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   995
----------------------------------// 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
   996
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2312
diff changeset
   997
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
   998
	_addtimer = 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
   999
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
  1000
	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
  1001
	wrapclient = wrapclient,
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5664
diff changeset
  1002
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
  1003
	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
  1004
	link = link,
4145
e992650185c8 net.server_select: Expose step() function (thanks Ɓukasz)
Matthew Wild <mwild1@gmail.com>
parents: 4111
diff changeset
  1005
	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
  1006
	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
  1007
	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
  1008
	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
  1009
	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
  1010
	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
  1011
	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
  1012
	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
  1013
	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
  1014
	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
  1015
	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
  1016
}