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,