Software /
code /
prosody
Comparison
net/server_event.lua @ 10061:5c71693c8345
Merge 0.11->trunk
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 08 Jul 2019 02:44:32 +0200 |
parent | 9915:9fe7b18bca15 |
child | 10233:600eee3c4752 |
comparison
equal
deleted
inserted
replaced
10060:7a36b7ac309b | 10061:5c71693c8345 |
---|---|
162 end | 162 end |
163 self:_close() | 163 self:_close() |
164 debug( "fatal error while ssl wrapping:", err ) | 164 debug( "fatal error while ssl wrapping:", err ) |
165 return false | 165 return false |
166 end | 166 end |
167 | |
168 if self.conn.sni then | |
169 if self.servername then | |
170 self.conn:sni(self.servername); | |
171 elseif self._server and type(self._server.hosts) == "table" and next(self._server.hosts) ~= nil then | |
172 self.conn:sni(self._server.hosts, true); | |
173 end | |
174 end | |
175 | |
167 self.conn:settimeout( 0 ) -- set non blocking | 176 self.conn:settimeout( 0 ) -- set non blocking |
168 local handshakecallback = coroutine_wrap(function( event ) | 177 local handshakecallback = coroutine_wrap(function( event ) |
169 local _, err | 178 local _, err |
170 local attempt = 0 | 179 local attempt = 0 |
171 local maxattempt = cfg.MAX_HANDSHAKE_ATTEMPTS | 180 local maxattempt = cfg.MAX_HANDSHAKE_ATTEMPTS |
251 return nointerface, noreading, nowriting | 260 return nointerface, noreading, nowriting |
252 end | 261 end |
253 | 262 |
254 --TODO: Deprecate | 263 --TODO: Deprecate |
255 function interface_mt:lock_read(switch) | 264 function interface_mt:lock_read(switch) |
265 log("warn", ":lock_read is deprecated, use :pasue() and :resume()"); | |
256 if switch then | 266 if switch then |
257 return self:pause(); | 267 return self:pause(); |
258 else | 268 else |
259 return self:resume(); | 269 return self:resume(); |
260 end | 270 end |
270 self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT ); -- register callback | 280 self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT ); -- register callback |
271 return true; | 281 return true; |
272 end | 282 end |
273 end | 283 end |
274 | 284 |
285 function interface_mt:pause_writes() | |
286 return self:_lock(self.nointerface, self.noreading, true); | |
287 end | |
288 | |
289 function interface_mt:resume_writes() | |
290 self:_lock(self.nointerface, self.noreading, false); | |
291 if self.writecallback and not self.eventwrite then | |
292 self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT ); -- register callback | |
293 return true; | |
294 end | |
295 end | |
296 | |
297 | |
275 function interface_mt:counter(c) | 298 function interface_mt:counter(c) |
276 if c then | 299 if c then |
277 self._connections = self._connections + c | 300 self._connections = self._connections + c |
278 end | 301 end |
279 return self._connections | 302 return self._connections |
280 end | 303 end |
281 | 304 |
282 -- Public methods | 305 -- Public methods |
283 function interface_mt:write(data) | 306 function interface_mt:write(data) |
284 if self.nowriting then return nil, "locked" end | 307 if self.nointerface then return nil, "locked"; end |
285 --vdebug( "try to send data to client, id/data:", self.id, data ) | 308 --vdebug( "try to send data to client, id/data:", self.id, data ) |
286 data = tostring( data ) | 309 data = tostring( data ) |
287 local len = #data | 310 local len = #data |
288 local total = len + self.writebufferlen | 311 local total = len + self.writebufferlen |
289 if total > cfg.MAX_SEND_LENGTH then -- check buffer length | 312 if total > cfg.MAX_SEND_LENGTH then -- check buffer length |
291 debug( "error:", err ) -- to much, check your app | 314 debug( "error:", err ) -- to much, check your app |
292 return nil, err | 315 return nil, err |
293 end | 316 end |
294 t_insert(self.writebuffer, data) -- new buffer | 317 t_insert(self.writebuffer, data) -- new buffer |
295 self.writebufferlen = total | 318 self.writebufferlen = total |
296 if not self.eventwrite then -- register new write event | 319 if not self.eventwrite and not self.nowriting then -- register new write event |
297 --vdebug( "register new write event" ) | 320 --vdebug( "register new write event" ) |
298 self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT ) | 321 self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT ) |
299 end | 322 end |
300 return true | 323 return true |
301 end | 324 end |
633 setmetatable(interface, interface_mt) | 656 setmetatable(interface, interface_mt) |
634 interfacelist[ interface ] = true -- add to interfacelist | 657 interfacelist[ interface ] = true -- add to interfacelist |
635 return interface | 658 return interface |
636 end | 659 end |
637 | 660 |
638 local function handleserver( server, addr, port, pattern, listener, sslctx ) -- creates an server interface | 661 local function handleserver( server, addr, port, pattern, listener, sslctx, startssl ) -- creates a server interface |
639 debug "creating server interface..." | 662 debug "creating server interface..." |
640 local interface = { | 663 local interface = { |
641 _connections = 0; | 664 _connections = 0; |
642 | 665 |
643 type = "server"; | 666 type = "server"; |
649 fatalerror = false; -- error message | 672 fatalerror = false; -- error message |
650 nointerface = true; -- lock/unlock parameter | 673 nointerface = true; -- lock/unlock parameter |
651 | 674 |
652 _ip = addr, _port = port, _pattern = pattern, | 675 _ip = addr, _port = port, _pattern = pattern, |
653 _sslctx = sslctx; | 676 _sslctx = sslctx; |
677 hosts = {}; | |
654 } | 678 } |
655 interface.id = tostring(interface):match("%x+$"); | 679 interface.id = tostring(interface):match("%x+$"); |
656 interface.readcallback = function( event ) -- server handler, called on incoming connections | 680 interface.readcallback = function( event ) -- server handler, called on incoming connections |
657 --vdebug( "server can accept, id/addr/port:", interface, addr, port ) | 681 --vdebug( "server can accept, id/addr/port:", interface, addr, port ) |
658 if interface.fatalerror then | 682 if interface.fatalerror then |
679 end | 703 end |
680 local client_ip, client_port = client:getpeername( ) | 704 local client_ip, client_port = client:getpeername( ) |
681 interface._connections = interface._connections + 1 -- increase connection count | 705 interface._connections = interface._connections + 1 -- increase connection count |
682 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx ) | 706 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx ) |
683 --vdebug( "client id:", clientinterface, "startssl:", startssl ) | 707 --vdebug( "client id:", clientinterface, "startssl:", startssl ) |
684 if has_luasec and sslctx then | 708 if has_luasec and startssl then |
685 clientinterface:starttls(sslctx, true) | 709 clientinterface:starttls(sslctx, true) |
686 else | 710 else |
687 clientinterface:_start_session( true ) | 711 clientinterface:_start_session( true ) |
688 end | 712 end |
689 debug( "accepted incoming client connection from:", client_ip or "<unknown IP>", client_port or "<unknown port>", "to", port or "<unknown port>"); | 713 debug( "accepted incoming client connection from:", client_ip or "<unknown IP>", client_port or "<unknown port>", "to", port or "<unknown port>"); |
698 interfacelist[ interface ] = true | 722 interfacelist[ interface ] = true |
699 interface:_start_session() | 723 interface:_start_session() |
700 return interface | 724 return interface |
701 end | 725 end |
702 | 726 |
703 local function addserver( addr, port, listener, pattern, sslctx, startssl ) -- TODO: check arguments | 727 local function listen(addr, port, listener, config) |
704 --vdebug( "creating new tcp server with following parameters:", addr or "nil", port or "nil", sslctx or "nil", startssl or "nil") | 728 config = config or {} |
705 if sslctx and not has_luasec then | 729 if config.sslctx and not has_luasec then |
706 debug "fatal error: luasec not found" | 730 debug "fatal error: luasec not found" |
707 return nil, "luasec not found" | 731 return nil, "luasec not found" |
708 end | 732 end |
709 local server, err = socket.bind( addr, port, cfg.ACCEPT_QUEUE ) -- create server socket | 733 local server, err = socket.bind( addr, port, cfg.ACCEPT_QUEUE ) -- create server socket |
710 if not server then | 734 if not server then |
711 debug( "creating server socket on "..addr.." port "..port.." failed:", err ) | 735 debug( "creating server socket on "..addr.." port "..port.." failed:", err ) |
712 return nil, err | 736 return nil, err |
713 end | 737 end |
714 local interface = handleserver( server, addr, port, pattern, listener, sslctx, startssl ) -- new server handler | 738 local interface = handleserver( server, addr, port, config.read_size, listener, config.tls_ctx, config.tls_direct) -- new server handler |
715 debug( "new server created with id:", tostring(interface)) | 739 debug( "new server created with id:", tostring(interface)) |
716 return interface | 740 return interface |
741 end | |
742 | |
743 local function addserver( addr, port, listener, pattern, sslctx ) -- TODO: check arguments | |
744 --vdebug( "creating new tcp server with following parameters:", addr or "nil", port or "nil", sslctx or "nil", startssl or "nil") | |
745 return listen( addr, port, listener, { | |
746 read_size = pattern, | |
747 tls_ctx = sslctx, | |
748 tls_direct = not not sslctx, | |
749 }); | |
717 end | 750 end |
718 | 751 |
719 local function wrapclient( client, ip, port, listeners, pattern, sslctx ) | 752 local function wrapclient( client, ip, port, listeners, pattern, sslctx ) |
720 local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx ) | 753 local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx ) |
721 interface:_start_connection(sslctx) | 754 interface:_start_connection(sslctx) |
874 link = link, | 907 link = link, |
875 event = levent, | 908 event = levent, |
876 event_base = base, | 909 event_base = base, |
877 addevent = newevent, | 910 addevent = newevent, |
878 addserver = addserver, | 911 addserver = addserver, |
912 listen = listen, | |
879 addclient = addclient, | 913 addclient = addclient, |
880 wrapclient = wrapclient, | 914 wrapclient = wrapclient, |
881 setquitting = setquitting, | 915 setquitting = setquitting, |
882 closeall = closeallservers, | 916 closeall = closeallservers, |
883 get_backend = get_backend, | 917 get_backend = get_backend, |