Software /
code /
prosody
Comparison
net/server_event.lua @ 10411:db2a06b9ff98
Merge 0.11->trunk
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 16 Nov 2019 16:52:31 +0100 |
parent | 10407:bd8fbee04a2f |
child | 10547:c77471c180ea |
comparison
equal
deleted
inserted
replaced
10410:659b577f280c | 10411:db2a06b9ff98 |
---|---|
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 |
438 function interface_mt:ondisconnect() | 461 function interface_mt:ondisconnect() |
439 end | 462 end |
440 function interface_mt:ontimeout() | 463 function interface_mt:ontimeout() |
441 end | 464 end |
442 function interface_mt:onreadtimeout() | 465 function interface_mt:onreadtimeout() |
443 self.fatalerror = "timeout during receiving" | |
444 debug( "connection failed:", self.fatalerror ) | |
445 self:_close() | |
446 self.eventread = nil | |
447 end | 466 end |
448 function interface_mt:ondrain() | 467 function interface_mt:ondrain() |
449 end | 468 end |
450 function interface_mt:ondetach() | 469 function interface_mt:ondetach() |
451 end | 470 end |
454 function interface_mt:onstatus() | 473 function interface_mt:onstatus() |
455 end | 474 end |
456 | 475 |
457 -- End of client interface methods | 476 -- End of client interface methods |
458 | 477 |
459 local function handleclient( client, ip, port, server, pattern, listener, sslctx ) -- creates an client interface | 478 local function handleclient( client, ip, port, server, pattern, listener, sslctx, extra ) -- creates an client interface |
460 --vdebug("creating client interfacce...") | 479 --vdebug("creating client interfacce...") |
461 local interface = { | 480 local interface = { |
462 type = "client"; | 481 type = "client"; |
463 conn = client; | 482 conn = client; |
464 currenttime = socket_gettime( ); -- safe the origin | 483 currenttime = socket_gettime( ); -- safe the origin |
490 -- Properties | 509 -- Properties |
491 _ip = ip, _port = port, _server = server, _pattern = pattern, | 510 _ip = ip, _port = port, _server = server, _pattern = pattern, |
492 _serverport = (server and server:port() or nil), | 511 _serverport = (server and server:port() or nil), |
493 _sslctx = sslctx; -- parameters | 512 _sslctx = sslctx; -- parameters |
494 _usingssl = false; -- client is using ssl; | 513 _usingssl = false; -- client is using ssl; |
514 extra = extra; | |
515 servername = extra and extra.servername; | |
495 } | 516 } |
496 if not has_luasec then interface.starttls = false; end | 517 if not has_luasec then interface.starttls = false; end |
497 interface.id = tostring(interface):match("%x+$"); | 518 interface.id = tostring(interface):match("%x+$"); |
498 interface.writecallback = function( event ) -- called on write events | 519 interface.writecallback = function( event ) -- called on write events |
499 --vdebug( "new client write event, id/ip/port:", interface, ip, port ) | 520 --vdebug( "new client write event, id/ip/port:", interface, ip, port ) |
633 setmetatable(interface, interface_mt) | 654 setmetatable(interface, interface_mt) |
634 interfacelist[ interface ] = true -- add to interfacelist | 655 interfacelist[ interface ] = true -- add to interfacelist |
635 return interface | 656 return interface |
636 end | 657 end |
637 | 658 |
638 local function handleserver( server, addr, port, pattern, listener, sslctx ) -- creates an server interface | 659 local function handleserver( server, addr, port, pattern, listener, sslctx, startssl ) -- creates a server interface |
639 debug "creating server interface..." | 660 debug "creating server interface..." |
640 local interface = { | 661 local interface = { |
641 _connections = 0; | 662 _connections = 0; |
642 | 663 |
643 type = "server"; | 664 type = "server"; |
649 fatalerror = false; -- error message | 670 fatalerror = false; -- error message |
650 nointerface = true; -- lock/unlock parameter | 671 nointerface = true; -- lock/unlock parameter |
651 | 672 |
652 _ip = addr, _port = port, _pattern = pattern, | 673 _ip = addr, _port = port, _pattern = pattern, |
653 _sslctx = sslctx; | 674 _sslctx = sslctx; |
675 hosts = {}; | |
654 } | 676 } |
655 interface.id = tostring(interface):match("%x+$"); | 677 interface.id = tostring(interface):match("%x+$"); |
656 interface.readcallback = function( event ) -- server handler, called on incoming connections | 678 interface.readcallback = function( event ) -- server handler, called on incoming connections |
657 --vdebug( "server can accept, id/addr/port:", interface, addr, port ) | 679 --vdebug( "server can accept, id/addr/port:", interface, addr, port ) |
658 if interface.fatalerror then | 680 if interface.fatalerror then |
679 end | 701 end |
680 local client_ip, client_port = client:getpeername( ) | 702 local client_ip, client_port = client:getpeername( ) |
681 interface._connections = interface._connections + 1 -- increase connection count | 703 interface._connections = interface._connections + 1 -- increase connection count |
682 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx ) | 704 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx ) |
683 --vdebug( "client id:", clientinterface, "startssl:", startssl ) | 705 --vdebug( "client id:", clientinterface, "startssl:", startssl ) |
684 if has_luasec and sslctx then | 706 if has_luasec and startssl then |
685 clientinterface:starttls(sslctx, true) | 707 clientinterface:starttls(sslctx, true) |
686 else | 708 else |
687 clientinterface:_start_session( true ) | 709 clientinterface:_start_session( true ) |
688 end | 710 end |
689 debug( "accepted incoming client connection from:", client_ip or "<unknown IP>", client_port or "<unknown port>", "to", port or "<unknown port>"); | 711 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 | 720 interfacelist[ interface ] = true |
699 interface:_start_session() | 721 interface:_start_session() |
700 return interface | 722 return interface |
701 end | 723 end |
702 | 724 |
703 local function addserver( addr, port, listener, pattern, sslctx, startssl ) -- TODO: check arguments | 725 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") | 726 config = config or {} |
705 if sslctx and not has_luasec then | 727 if config.sslctx and not has_luasec then |
706 debug "fatal error: luasec not found" | 728 debug "fatal error: luasec not found" |
707 return nil, "luasec not found" | 729 return nil, "luasec not found" |
708 end | 730 end |
709 local server, err = socket.bind( addr, port, cfg.ACCEPT_QUEUE ) -- create server socket | 731 local server, err = socket.bind( addr, port, cfg.ACCEPT_QUEUE ) -- create server socket |
710 if not server then | 732 if not server then |
711 debug( "creating server socket on "..addr.." port "..port.." failed:", err ) | 733 debug( "creating server socket on "..addr.." port "..port.." failed:", err ) |
712 return nil, err | 734 return nil, err |
713 end | 735 end |
714 local interface = handleserver( server, addr, port, pattern, listener, sslctx, startssl ) -- new server handler | 736 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)) | 737 debug( "new server created with id:", tostring(interface)) |
716 return interface | 738 return interface |
717 end | 739 end |
718 | 740 |
719 local function wrapclient( client, ip, port, listeners, pattern, sslctx ) | 741 local function addserver( addr, port, listener, pattern, sslctx ) -- TODO: check arguments |
720 local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx ) | 742 --vdebug( "creating new tcp server with following parameters:", addr or "nil", port or "nil", sslctx or "nil", startssl or "nil") |
743 return listen( addr, port, listener, { | |
744 read_size = pattern, | |
745 tls_ctx = sslctx, | |
746 tls_direct = not not sslctx, | |
747 }); | |
748 end | |
749 | |
750 local function wrapclient( client, ip, port, listeners, pattern, sslctx, extra ) | |
751 local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx, extra ) | |
721 interface:_start_connection(sslctx) | 752 interface:_start_connection(sslctx) |
722 return interface, client | 753 return interface, client |
723 --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface | 754 --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface |
724 end | 755 end |
725 | 756 |
726 local function addclient( addr, serverport, listener, pattern, sslctx, typ ) | 757 local function addclient( addr, serverport, listener, pattern, sslctx, typ, extra ) |
727 if sslctx and not has_luasec then | 758 if sslctx and not has_luasec then |
728 debug "need luasec, but not available" | 759 debug "need luasec, but not available" |
729 return nil, "luasec not found" | 760 return nil, "luasec not found" |
730 end | 761 end |
731 if not typ then | 762 if not typ then |
748 end | 779 end |
749 client:settimeout( 0 ) -- set nonblocking | 780 client:settimeout( 0 ) -- set nonblocking |
750 local res, err = client:setpeername( addr, serverport ) -- connect | 781 local res, err = client:setpeername( addr, serverport ) -- connect |
751 if res or ( err == "timeout" ) then | 782 if res or ( err == "timeout" ) then |
752 local ip, port = client:getsockname( ) | 783 local ip, port = client:getsockname( ) |
753 local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx ) | 784 local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx, extra ) |
754 debug( "new connection id:", interface.id ) | 785 debug( "new connection id:", interface.id ) |
755 return interface, err | 786 return interface, err |
756 else | 787 else |
757 debug( "new connection failed:", err ) | 788 debug( "new connection failed:", err ) |
758 return nil, err | 789 return nil, err |
874 link = link, | 905 link = link, |
875 event = levent, | 906 event = levent, |
876 event_base = base, | 907 event_base = base, |
877 addevent = newevent, | 908 addevent = newevent, |
878 addserver = addserver, | 909 addserver = addserver, |
910 listen = listen, | |
879 addclient = addclient, | 911 addclient = addclient, |
880 wrapclient = wrapclient, | 912 wrapclient = wrapclient, |
881 setquitting = setquitting, | 913 setquitting = setquitting, |
882 closeall = closeallservers, | 914 closeall = closeallservers, |
883 get_backend = get_backend, | 915 get_backend = get_backend, |