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,