Software / code / prosody
Comparison
net/server_select.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 | 9993:02a41315d275 |
| child | 10234:d4390c427a66 |
comparison
equal
deleted
inserted
replaced
| 10232:58685d77c07c | 10233:600eee3c4752 |
|---|---|
| 264 end | 264 end |
| 265 end | 265 end |
| 266 return handler | 266 return handler |
| 267 end | 267 end |
| 268 | 268 |
| 269 wrapconnection = function( server, listeners, socket, ip, serverport, clientport, pattern, sslctx, ssldirect ) -- this function wraps a client to a handler object | 269 wrapconnection = function( server, listeners, socket, ip, serverport, clientport, pattern, sslctx, ssldirect, extra ) -- this function wraps a client to a handler object |
| 270 | 270 |
| 271 if socket:getfd() >= _maxfd then | 271 if socket:getfd() >= _maxfd then |
| 272 out_error("server.lua: Disallowed FD number: "..socket:getfd()) -- PROTIP: Switch to libevent | 272 out_error("server.lua: Disallowed FD number: "..socket:getfd()) -- PROTIP: Switch to libevent |
| 273 socket:close( ) -- Should we send some kind of error here? | 273 socket:close( ) -- Should we send some kind of error here? |
| 274 if server then | 274 if server then |
| 313 local maxreadlen = _maxreadlen | 313 local maxreadlen = _maxreadlen |
| 314 | 314 |
| 315 --// public methods of the object //-- | 315 --// public methods of the object //-- |
| 316 | 316 |
| 317 local handler = bufferqueue -- saves a table ^_^ | 317 local handler = bufferqueue -- saves a table ^_^ |
| 318 | |
| 319 handler.extra = extra | |
| 318 | 320 |
| 319 handler.dispatch = function( ) | 321 handler.dispatch = function( ) |
| 320 return dispatch | 322 return dispatch |
| 321 end | 323 end |
| 322 handler.disconnect = function( ) | 324 handler.disconnect = function( ) |
| 1003 return "select"; | 1005 return "select"; |
| 1004 end | 1006 end |
| 1005 | 1007 |
| 1006 --// EXPERIMENTAL //-- | 1008 --// EXPERIMENTAL //-- |
| 1007 | 1009 |
| 1008 local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx ) | 1010 local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx, extra ) |
| 1009 local handler, socket, err = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx, sslctx) | 1011 local handler, socket, err = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx, sslctx, extra) |
| 1010 if not handler then return nil, err end | 1012 if not handler then return nil, err end |
| 1011 _socketlist[ socket ] = handler | 1013 _socketlist[ socket ] = handler |
| 1012 if not sslctx then | 1014 if not sslctx then |
| 1013 _readlistlen = addsocket(_readlist, socket, _readlistlen) | 1015 _readlistlen = addsocket(_readlist, socket, _readlistlen) |
| 1014 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen) | 1016 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen) |
| 1023 end | 1025 end |
| 1024 end | 1026 end |
| 1025 return handler, socket | 1027 return handler, socket |
| 1026 end | 1028 end |
| 1027 | 1029 |
| 1028 local addclient = function( address, port, listeners, pattern, sslctx, typ ) | 1030 local addclient = function( address, port, listeners, pattern, sslctx, typ, extra ) |
| 1029 local err | 1031 local err |
| 1030 if type( listeners ) ~= "table" then | 1032 if type( listeners ) ~= "table" then |
| 1031 err = "invalid listener table" | 1033 err = "invalid listener table" |
| 1032 elseif type ( address ) ~= "string" then | 1034 elseif type ( address ) ~= "string" then |
| 1033 err = "invalid address" | 1035 err = "invalid address" |
| 1060 return nil, err | 1062 return nil, err |
| 1061 end | 1063 end |
| 1062 client:settimeout( 0 ) | 1064 client:settimeout( 0 ) |
| 1063 local ok, err = client:setpeername( address, port ) | 1065 local ok, err = client:setpeername( address, port ) |
| 1064 if ok or err == "timeout" or err == "Operation already in progress" then | 1066 if ok or err == "timeout" or err == "Operation already in progress" then |
| 1065 return wrapclient( client, address, port, listeners, pattern, sslctx ) | 1067 return wrapclient( client, address, port, listeners, pattern, sslctx, extra ) |
| 1066 else | 1068 else |
| 1067 return nil, err | 1069 return nil, err |
| 1068 end | 1070 end |
| 1069 end | 1071 end |
| 1070 | 1072 |