Mercurial > prosody-hg
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 |
| parents | 9fe7b18bca15 |
| children | 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 |
