Comparison

net/server_event.lua @ 10233:600eee3c4752

net.server: Accept and save an 'extra' field for client connections This lets code attach some extra data to be attached to client connections.
author Kim Alvefur <zash@zash.se>
date Sun, 01 Sep 2019 01:55:55 +0200
parent 9915:9fe7b18bca15
child 10234:d4390c427a66
comparison
equal deleted inserted replaced
10232:58685d77c07c 10233:600eee3c4752
477 function interface_mt:onstatus() 477 function interface_mt:onstatus()
478 end 478 end
479 479
480 -- End of client interface methods 480 -- End of client interface methods
481 481
482 local function handleclient( client, ip, port, server, pattern, listener, sslctx ) -- creates an client interface 482 local function handleclient( client, ip, port, server, pattern, listener, sslctx, extra ) -- creates an client interface
483 --vdebug("creating client interfacce...") 483 --vdebug("creating client interfacce...")
484 local interface = { 484 local interface = {
485 type = "client"; 485 type = "client";
486 conn = client; 486 conn = client;
487 currenttime = socket_gettime( ); -- safe the origin 487 currenttime = socket_gettime( ); -- safe the origin
513 -- Properties 513 -- Properties
514 _ip = ip, _port = port, _server = server, _pattern = pattern, 514 _ip = ip, _port = port, _server = server, _pattern = pattern,
515 _serverport = (server and server:port() or nil), 515 _serverport = (server and server:port() or nil),
516 _sslctx = sslctx; -- parameters 516 _sslctx = sslctx; -- parameters
517 _usingssl = false; -- client is using ssl; 517 _usingssl = false; -- client is using ssl;
518 extra = extra;
518 } 519 }
519 if not has_luasec then interface.starttls = false; end 520 if not has_luasec then interface.starttls = false; end
520 interface.id = tostring(interface):match("%x+$"); 521 interface.id = tostring(interface):match("%x+$");
521 interface.writecallback = function( event ) -- called on write events 522 interface.writecallback = function( event ) -- called on write events
522 --vdebug( "new client write event, id/ip/port:", interface, ip, port ) 523 --vdebug( "new client write event, id/ip/port:", interface, ip, port )
747 tls_ctx = sslctx, 748 tls_ctx = sslctx,
748 tls_direct = not not sslctx, 749 tls_direct = not not sslctx,
749 }); 750 });
750 end 751 end
751 752
752 local function wrapclient( client, ip, port, listeners, pattern, sslctx ) 753 local function wrapclient( client, ip, port, listeners, pattern, sslctx, extra )
753 local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx ) 754 local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx, extra )
754 interface:_start_connection(sslctx) 755 interface:_start_connection(sslctx)
755 return interface, client 756 return interface, client
756 --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface 757 --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface
757 end 758 end
758 759
759 local function addclient( addr, serverport, listener, pattern, sslctx, typ ) 760 local function addclient( addr, serverport, listener, pattern, sslctx, typ, extra )
760 if sslctx and not has_luasec then 761 if sslctx and not has_luasec then
761 debug "need luasec, but not available" 762 debug "need luasec, but not available"
762 return nil, "luasec not found" 763 return nil, "luasec not found"
763 end 764 end
764 if not typ then 765 if not typ then
781 end 782 end
782 client:settimeout( 0 ) -- set nonblocking 783 client:settimeout( 0 ) -- set nonblocking
783 local res, err = client:setpeername( addr, serverport ) -- connect 784 local res, err = client:setpeername( addr, serverport ) -- connect
784 if res or ( err == "timeout" ) then 785 if res or ( err == "timeout" ) then
785 local ip, port = client:getsockname( ) 786 local ip, port = client:getsockname( )
786 local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx ) 787 local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx, extra )
787 debug( "new connection id:", interface.id ) 788 debug( "new connection id:", interface.id )
788 return interface, err 789 return interface, err
789 else 790 else
790 debug( "new connection failed:", err ) 791 debug( "new connection failed:", err )
791 return nil, err 792 return nil, err