From 4a3a52f7a1e1b36427a6543dab5fe70499021dd9 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Nov 2009 22:08:10 +0000 Subject: net.adns: Some cleanup, happens to also make it compatible with libevent --- net/adns.lua | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/net/adns.lua b/net/adns.lua index c9cb9476..d6beffbb 100644 --- a/net/adns.lua +++ b/net/adns.lua @@ -43,33 +43,32 @@ function cancel(handle, call_handler) end function new_async_socket(sock, resolver) - local newconn, peername = {}, ""; + local peername = ""; local listener = {}; + local handler = {}; function listener.onincoming(conn, data) - dns.feed(sock, data); + dns.feed(handler, data); end function listener.ondisconnect(conn, err) log("warn", "DNS socket for %s disconnected: %s", peername, err); local servers = resolver.server; - if resolver.socketset[newconn.handler] == resolver.best_server and resolver.best_server == #servers then + if resolver.socketset[conn] == resolver.best_server and resolver.best_server == #servers then log("error", "Exhausted all %d configured DNS servers, next lookup will try %s again", #servers, servers[1]); end resolver:servfail(conn); -- Let the magic commence end - newconn.handler, newconn._socket = server.wrapclient(sock, "dns", 53, listener); - if not newconn.handler then + handler = server.wrapclient(sock, "dns", 53, listener); + if not handler then log("warn", "handler is nil"); end - if not newconn._socket then - log("warn", "socket is nil"); - end - newconn.handler.settimeout = function () end - newconn.handler.setsockname = function (_, ...) return sock:setsockname(...); end - newconn.handler.setpeername = function (_, ...) peername = (...); local ret = sock:setpeername(...); _.setsend(sock.send); return ret; end - newconn.handler.connect = function (_, ...) return sock:connect(...) end - newconn.handler.send = function (_, data) _.write(_, data); return _.sendbuffer(); end - return newconn.handler; + + handler.settimeout = function () end + handler.setsockname = function (_, ...) return sock:setsockname(...); end + handler.setpeername = function (_, ...) peername = (...); local ret = sock:setpeername(...); _:set_send(sock.send); return ret; end + handler.connect = function (_, ...) return sock:connect(...) end + handler.send = function (_, data) _:write(data); return _.sendbuffer and _.sendbuffer(); end + return handler; end dns:socket_wrapper_set(new_async_socket); -- cgit v1.2.3 From 9d32568d5d90efa317e4f77a94a678a653547cf0 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Nov 2009 22:08:47 +0000 Subject: net.server_select: Rename server.setsend() to server.set_send() for consistency --- net/server_select.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/server_select.lua b/net/server_select.lua index d7970296..3b3f3768 100644 --- a/net/server_select.lua +++ b/net/server_select.lua @@ -427,7 +427,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport pattern = new or pattern return pattern end - handler.setsend = function ( self, newsend ) + handler.set_send = function ( self, newsend ) send = newsend or send return send end -- cgit v1.2.3 From df4d4cd44521d393dbe0a3ee8a62fe0add80f2ba Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Nov 2009 22:15:40 +0000 Subject: net.server_event: Fix to make ontimeout() listener callback work --- net/server_event.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/server_event.lua b/net/server_event.lua index b467a84d..74dffb94 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -138,7 +138,7 @@ do local callback = function( event ) if EV_TIMEOUT == event then -- timout during connection self.fatalerror = "connection timeout" - self.listener.ontimeout( self ) -- call timeout listener + self:ontimeout() -- call timeout listener self:_close() debug( "new connection failed. id:", self.id, "error:", self.fatalerror ) else @@ -432,6 +432,7 @@ do onconnect = listener.onconnect; -- will be called when client disconnects ondisconnect = listener.ondisconnect; -- will be called when client disconnects onincoming = listener.onincoming; -- will be called when client sends data + ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs eventread = false, eventwrite = false, eventclose = false, eventhandshake = false, eventstarthandshake = false; -- event handler eventconnect = false, eventsession = false; -- more event handler... -- cgit v1.2.3 From 05348c61f37e80e99544ab9f655833a06c88612c Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Nov 2009 22:18:44 +0000 Subject: net.server_handler: Add stub handlers as fallbacks for those listeners don't implement --- net/server_event.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/net/server_event.lua b/net/server_event.lua index 74dffb94..f5eafaf6 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -405,7 +405,14 @@ do return true end - function interface_mt.onconnect() + -- Stub handlers + function interface_mt:onconnect() + end + function interface_mt:onincoming() + end + function interface_mt:ondisconnect() + end + function interface_mt:ontimeout() end end -- cgit v1.2.3 From e6d079f88724611385a25a1c2554b13bde9bc44a Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Nov 2009 22:19:49 +0000 Subject: net.server_event: Count the number of client connections *upwards* :) --- net/server_event.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/server_event.lua b/net/server_event.lua index f5eafaf6..8187a7d0 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -263,7 +263,7 @@ do _ = self.eventreadtimeout and self.eventreadtimeout:close( ) _ = self.ondisconnect and self:ondisconnect( self.fatalerror ) -- call ondisconnect listener (wont be the case if handshake failed on connect) _ = self.conn and self.conn:close( ) -- close connection, must also be called outside of any socket registered events! - self._server:counter(-1); + _ = self._server and self._server:counter(-1); self.eventread, self.eventwrite = nil, nil self.eventstarthandshake, self.eventhandshake, self.eventclose = nil, nil, nil self.readcallback, self.writecallback = nil, nil @@ -283,7 +283,7 @@ do function interface_mt:counter(c) if c then - self._connections = self._connections - c + self._connections = self._connections + c end return self._connections end -- cgit v1.2.3 From 944ab8a84e38a7d10257fab36578e37cb571d8cf Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Nov 2009 22:21:12 +0000 Subject: net.server_event: Hide starttls function when the connection is not SSL-enabled --- net/server_event.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/net/server_event.lua b/net/server_event.lua index 8187a7d0..79b2f388 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -374,6 +374,12 @@ do function interface_mt:set_sslctx(sslctx) self._sslctx = sslctx; + if sslctx then + self.starttls = nil; -- use starttls() of interface_mt + else + self.starttls = false; -- prevent starttls() + end + end end function interface_mt:starttls() @@ -458,6 +464,9 @@ do _sslctx = sslctx; -- parameters _usingssl = false; -- client is using ssl; } + if not sslctx then + interface.starttls = false -- don't allow TLS + end interface.id = tostring(interface):match("%x+$"); interface.writecallback = function( event ) -- called on write events --vdebug( "new client write event, id/ip/port:", interface, ip, port ) -- cgit v1.2.3 From 7dae521ba5a3fdc39c0bba3e1d5ade1c0812be1e Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Nov 2009 22:22:03 +0000 Subject: net.server_event: Add set_send() for compatibility with server_select --- net/server_event.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/server_event.lua b/net/server_event.lua index 79b2f388..be006cab 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -380,6 +380,9 @@ do self.starttls = false; -- prevent starttls() end end + + function interface_mt:set_send(new_send) + -- No-op, we always use the underlying connection's send end function interface_mt:starttls() -- cgit v1.2.3 From 422a717900a10b8cd991b339bd0a540840695866 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Nov 2009 22:23:51 +0000 Subject: net.server_event: tostring() some debug logging parameters --- net/server_event.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/server_event.lua b/net/server_event.lua index be006cab..5e2424ea 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -538,9 +538,9 @@ do end interface.readcallback = function( event ) -- called on read events - --vdebug( "new client read event, id/ip/port:", interface, ip, port ) + --vdebug( "new client read event, id/ip/port:", tostring(interface.id), tostring(ip), tostring(port) ) if interface.noreading or interface.fatalerror then -- leave this event - --vdebug( "leaving this event because:", interface.noreading or interface.fatalerror ) + --vdebug( "leaving this event because:", tostring(interface.noreading or interface.fatalerror) ) interface.eventread = nil return -1 end @@ -554,7 +554,7 @@ do if interface._usingssl then -- handle luasec if interface.eventwritetimeout then -- ok, in the past writecallback was regged local ret = interface.writecallback( ) -- call it - --vdebug( "tried to write in readcallback, result:", ret ) + --vdebug( "tried to write in readcallback, result:", tostring(ret) ) end if interface.eventreadtimeout then interface.eventreadtimeout:close( ) -- cgit v1.2.3 From 546954e85cee23594c84866db3c56842886ad541 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Thu, 26 Nov 2009 22:25:13 +0000 Subject: net.server_event: Add addclient/wrapclient compatible with server_select, DNS and s2s should now work with libevent \o/ --- net/server_event.lua | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/net/server_event.lua b/net/server_event.lua index 5e2424ea..450bd341 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -693,26 +693,16 @@ local addserver = ( function( ) end end )( ) -local wrapclient = ( function( ) - return function( client, addr, serverport, listener, pattern, localaddr, localport, sslcfg, startssl ) - debug( "try to connect to:", addr, serverport, "with parameters:", pattern, localaddr, localport, sslcfg, startssl ) - local sslctx - if sslcfg then -- handle ssl/new context - if not ssl then - debug "need luasec, but not available" - return nil, "luasec not found" - end - sslctx, err = ssl.newcontext( sslcfg ) - if err then - debug( "cannot create new ssl context:", err ) - return nil, err - end - end +local addclient, wrapclient +do + function wrapclient( client, ip, port, listeners, pattern, sslctx, startssl ) + local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx ) + interface:_start_session() + return interface + --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface end -end )( ) - -local addclient = ( function( ) - return function( addr, serverport, listener, pattern, localaddr, localport, sslcfg, startssl ) + + function addclient( addr, serverport, listener, pattern, localaddr, localport, sslcfg, startssl ) local client, err = socket.tcp() -- creating new socket if not client then debug( "cannot create socket:", err ) @@ -726,23 +716,35 @@ local addclient = ( function( ) return nil, err end end + local sslctx + if sslcfg then -- handle ssl/new context + if not ssl then + debug "need luasec, but not available" + return nil, "luasec not found" + end + sslctx, err = ssl.newcontext( sslcfg ) + if err then + debug( "cannot create new ssl context:", err ) + return nil, err + end + end local res, err = client:connect( addr, serverport ) -- connect if res or ( err == "timeout" ) then local ip, port = client:getsockname( ) local server = function( ) return nil, "this is a dummy server interface" end - local interface = handleclient( client, ip, port, server, pattern, listener, sslctx ) + local interface = wrapclient( client, ip, serverport, listeners, pattern, sslctx, startssl ) interface:_start_connection( startssl ) - debug( "new connection id:", interface ) + debug( "new connection id:", interface.id ) return interface, err else debug( "new connection failed:", err ) return nil, err end - return wrapclient( client, addr, serverport, listener, pattern, localaddr, localport, sslcfg, startssl ) end -end )( ) +end + local loop = function( ) -- starts the event loop return base:loop( ) -- cgit v1.2.3