Merge with trunk
authorMatthew Wild <mwild1@gmail.com>
Sun, 22 Nov 2009 04:50:42 +0000 (04:50 +0000)
committerMatthew Wild <mwild1@gmail.com>
Sun, 22 Nov 2009 04:50:42 +0000 (04:50 +0000)
15 files changed:
core/s2smanager.lua
core/sessionmanager.lua
net/adns.lua
net/connlisteners.lua
net/http.lua
net/httpclient_listener.lua
net/httpserver.lua
net/httpserver_listener.lua
net/server.lua
net/server_event.lua
net/server_select.lua
net/xmppclient_listener.lua
net/xmppcomponent_listener.lua
net/xmppserver_listener.lua
plugins/mod_tls.lua

index d8edaed0537da71772324e756e1b20eb5f736782..fb532a731f70382ecfd28f773cad9efba36440a5 100644 (file)
@@ -128,7 +128,7 @@ function new_incoming(conn)
        open_sessions = open_sessions + 1;
        local w, log = conn.write, logger_init("s2sin"..tostring(conn):match("[a-f0-9]+$"));
        session.log = log;
-       session.sends2s = function (t) log("debug", "sending: %s", (t.top_tag and t:top_tag()) or t:match("^([^>]*>?)")); w(tostring(t)); end
+       session.sends2s = function (t) log("debug", "sending: %s", (t.top_tag and t:top_tag()) or t:match("^([^>]*>?)"); w(conn, tostring(t)); end
        incoming_s2s[session] = true;
        add_task(connect_timeout, function ()
                if session.conn ~= conn or
@@ -317,9 +317,9 @@ function make_connect(host_session, connect_host, connect_port)
        cl.register_outgoing(conn, host_session);
        
        local w, log = conn.write, host_session.log;
-       host_session.sends2s = function (t) log("debug", "sending: %s", (t.top_tag and t:top_tag()) or t:match("^[^>]*>?")); w(tostring(t)); end
+       host_session.sends2s = function (t) log("debug", "sending: %s", (t.top_tag and t:top_tag()) or t:match("^[^>]*>?")); w(conn, tostring(t)); end
        
-       conn.write(format([[<stream:stream xmlns='jabber:server' xmlns:db='jabber:server:dialback' xmlns:stream='http://etherx.jabber.org/streams' from='%s' to='%s' version='1.0' xml:lang='en'>]], from_host, to_host));
+       conn:write(format([[<stream:stream xmlns='jabber:server' xmlns:db='jabber:server:dialback' xmlns:stream='http://etherx.jabber.org/streams' from='%s' to='%s' version='1.0' xml:lang='en'>]], from_host, to_host));
        log("debug", "Connection attempt in progress...");
        add_task(connect_timeout, function ()
                if host_session.conn ~= conn or
@@ -391,7 +391,7 @@ function streamopened(session, attr)
                if send_buffer and #send_buffer > 0 then
                        log("debug", "Sending s2s send_buffer now...");
                        for i, data in ipairs(send_buffer) do
-                               session.sends2s(data);
+                               session.sends2s(tostring(data));
                                send_buffer[i] = nil;
                        end
                end
index 08e70d44dc3f53c5ea00e266a5254f4df8327fe5..7e609f22055b33f94fde119081613f99e19ae757 100644 (file)
@@ -50,8 +50,8 @@ function new_session(conn)
        open_sessions = open_sessions + 1;
        log("debug", "open sessions now: ".. open_sessions);
        local w = conn.write;
-       session.send = function (t) w(tostring(t)); end
-       session.ip = conn.ip();
+       session.send = function (t) w(conn, tostring(t)); end
+       session.ip = conn:ip();
        local conn_name = "c2s"..tostring(conn):match("[a-f0-9]+$");
        session.log = logger.init(conn_name);
        
index b0c9a62506ae2874a570c510d75d7644b5b6c334..c9cb9476a17eea1af38b4b3f084bfee4ac23398a 100644 (file)
@@ -45,10 +45,10 @@ end
 function new_async_socket(sock, resolver)
        local newconn, peername = {}, "<unknown>";
        local listener = {};
-       function listener.incoming(conn, data)
+       function listener.onincoming(conn, data)
                dns.feed(sock, data);
        end
-       function listener.disconnect(conn, err)
+       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
@@ -68,7 +68,7 @@ function new_async_socket(sock, resolver)
        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     
+       newconn.handler.send = function (_, data) _.write(_, data); return _.sendbuffer(); end  
        return newconn.handler;
 end
 
index 230d92a454fd35b868b0590a421e8c05c1de1869..a9b92a8c81a47a2ce1957a8fbe7267f00aee55d9 100644 (file)
@@ -61,9 +61,14 @@ function start(name, udata)
                end
        end
        
-       return server.addserver(h, 
-                       (udata and udata.port) or h.default_port or error("Can't start listener "..name.." because no port was specified, and it has no default port", 0), 
-                               (udata and udata.interface) or h.default_interface or "*", (udata and udata.mode) or h.default_mode or 1, (udata and udata.ssl) or nil, 99999999, udata and udata.type == "ssl");
+       local interface = (udata and udata.interface) or h.default_interface or "*";
+       local port = (udata and udata.port) or h.default_port or error("Can't start listener "..name.." because no port was specified, and it has no default port", 0);
+       local mode = (udata and udata.mode) or h.default_mode or 1;
+       local ssl = (udata and udata.ssl) or nil;
+       local maxclients = 99999999;
+       local autossl = udata and udata.type == "ssl";
+       
+       return server.addserver(interface, port, h, mode, ssl, autossl);
 end
 
 return _M;
index 9d2f9b968f2ec3e7173176bb80af5b996cef620c..34ec11b4f4ca45fc7493d2ae08745f5fbda76057 100644 (file)
@@ -152,7 +152,7 @@ function request(u, ex, callback)
        end
        
        req.handler, req.conn = server.wrapclient(socket.tcp(), req.host, req.port or 80, listener, "*a");
-       req.write = req.handler.write;
+       req.write = function (...) return req.handler:write(...); end
        req.conn:settimeout(0);
        local ok, err = req.conn:connect(req.host, req.port or 80);
        if not ok and err ~= "timeout" then
@@ -200,7 +200,7 @@ end
 function destroy_request(request)
        if request.conn then
                request.handler.close()
-               listener.disconnect(request.conn, "closed");
+               listener.ondisconnect(request.conn, "closed");
        end
 end
 
index 69b7946b9f1441ee6dd123a65116e784e45059da..6517de442f9e90aad7d8abb4914cad433847c16d 100644 (file)
@@ -15,7 +15,7 @@ local buffers = {}; -- Buffers of partial lines
 
 local httpclient = { default_port = 80, default_mode = "*a" };
 
-function httpclient.listener(conn, data)
+function httpclient.onincoming(conn, data)
        local request = requests[conn];
 
        if not request then
@@ -28,7 +28,7 @@ function httpclient.listener(conn, data)
        end
 end
 
-function httpclient.disconnect(conn, err)
+function httpclient.ondisconnect(conn, err)
        local request = requests[conn];
        if request then
                request:reader(nil);
index ddb4475c2dc8d7e5d486e0b0a34d3f0bd2f2324d..51dca1668a441c58418ae23815f41b41de191ed4 100644 (file)
@@ -209,7 +209,7 @@ end
 
 function new_request(handler)
        return { handler = handler, conn = handler.socket, 
-                       write = handler.write, state = "request", 
+                       write = function (...) return handler:write(...); end, state = "request", 
                        server = http_servers[handler.serverport()],
                        send = send_response,
                        destroy = destroy_request,
@@ -230,7 +230,7 @@ function destroy_request(request)
                end
                request.handler.close()
                if request.conn then
-                       listener.disconnect(request.handler, "closed");
+                       listener.ondisconnect(request.handler, "closed");
                end
        end
 end
index 455191fb39e289daca4b27e1eccdf9fd619495bc..5a261a43cb40e314bf5d735793c1032c7728d590 100644 (file)
@@ -16,7 +16,7 @@ local requests = {}; -- Open requests
 
 local httpserver = { default_port = 80, default_mode = "*a" };
 
-function httpserver.listener(conn, data)
+function httpserver.onincoming(conn, data)
        local request = requests[conn];
 
        if not request then
@@ -34,7 +34,7 @@ function httpserver.listener(conn, data)
        end
 end
 
-function httpserver.disconnect(conn, err)
+function httpserver.ondisconnect(conn, err)
        local request = requests[conn];
        if request and not request.destroyed then
                request.conn = nil;
index 507bd81e45beb5672bab72912b3fa7edd6322547..15bba603f3a90fcc04884df913d5235fdf45c79c 100644 (file)
@@ -9,7 +9,7 @@ if have_luaevent and use_luaevent == true then
        
        -- Backwards compatibility for timers, addtimer
        -- called a function roughly every second
-       local add_task = require "util.timer";
+       local add_task = require "util.timer".add_task;
        function server.addtimer(f)
                return add_task(1, function (...) f(...); return 1; end);
        end
index 375ab47e0fb213b6521d793335d29fa40c735703..b467a84dc6c147e6f8ca034fb1e0809d5dcf25a7 100644 (file)
@@ -52,6 +52,7 @@ local log = require ("util.logger").init("socket")
 local function debug(...)\r
        return log("debug", ("%s "):rep(select('#', ...)), ...)\r
 end\r
+local vdebug = debug;\r
 \r
 local bitor = ( function( ) -- thx Rici Lake\r
        local hasbit = function( x, p )\r
@@ -139,14 +140,14 @@ do
                                        self.fatalerror = "connection timeout"\r
                                        self.listener.ontimeout( self )  -- call timeout listener\r
                                        self:_close()\r
-                                       debug( "new connection failed. id:", self, "error:", self.fatalerror )\r
+                                       debug( "new connection failed. id:", self.id, "error:", self.fatalerror )\r
                                else\r
                                        if plainssl then  -- start ssl session\r
                                                self:_start_ssl( self.listener.onconnect )\r
                                        else  -- normal connection\r
                                                self:_start_session( self.listener.onconnect )\r
                                        end\r
-                                       debug( "new connection established. id:", self )\r
+                                       debug( "new connection established. id:", self.id )\r
                                end\r
                                self.eventconnect = nil\r
                                return -1\r
@@ -158,28 +159,28 @@ do
                if self.type == "client" then\r
                        local callback = function( )\r
                                self:_lock( false,  false, false )\r
-                               --vdebug( "start listening on client socket with id:", self )      \r
+                               --vdebug( "start listening on client socket with id:", self.id )      \r
                                self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT )  -- register callback\r
-                               onconnect( self )\r
+                               self:onconnect()\r
                                self.eventsession = nil\r
                                return -1\r
                        end\r
                        self.eventsession = addevent( base, nil, EV_TIMEOUT, callback, 0 )\r
                else\r
                        self:_lock( false )\r
-                       --vdebug( "start listening on server socket with id:", self )\r
+                       --vdebug( "start listening on server socket with id:", self.id )\r
                        self.eventread = addevent( base, self.conn, EV_READ, self.readcallback )  -- register callback\r
                end\r
                return true\r
        end\r
        function interface_mt:_start_ssl(arg) -- old socket will be destroyed, therefore we have to close read/write events first\r
-                       --vdebug( "starting ssl session with client id:", self )\r
+                       --vdebug( "starting ssl session with client id:", self.id )\r
                        local _\r
                        _ = self.eventread and self.eventread:close( )  -- close events; this must be called outside of the event callbacks!\r
                        _ = self.eventwrite and self.eventwrite:close( )\r
                        self.eventread, self.eventwrite = nil, nil\r
                        local err\r
-                       self.conn, err = ssl.wrap( self.conn, self.sslctx )\r
+                       self.conn, err = ssl.wrap( self.conn, self._sslctx )\r
                        if err then\r
                                self.fatalerror = err\r
                                self.conn = nil  -- cannot be used anymore\r
@@ -198,7 +199,7 @@ do
                                        local maxattempt = cfg.MAX_HANDSHAKE_ATTEMPS\r
                                        while attempt < 1000 do  -- no endless loop\r
                                                attempt = attempt + 1\r
-                                               debug( "ssl handshake of client with id:", self, "attemp:", attempt )\r
+                                               debug( "ssl handshake of client with id:"..tostring(self).."attemp:"..attempt )\r
                                                if attempt > maxattempt then\r
                                                        self.fatalerror = "max handshake attemps exceeded"\r
                                                elseif EV_TIMEOUT == event then\r
@@ -211,16 +212,16 @@ do
                                                                self.receive = self.conn.receive\r
                                                                local onsomething\r
                                                                if "onconnect" == arg then  -- trigger listener\r
-                                                                       onsomething = self.listener.onconnect\r
+                                                                       onsomething = self.onconnect\r
                                                                else\r
-                                                                       onsomething = self.listener.onsslconnection\r
+                                                                       onsomething = self.onsslconnection\r
                                                                end\r
                                                                self:_start_session( onsomething )\r
                                                                debug( "ssl handshake done" )\r
                                                                self.eventhandshake = nil\r
                                                                return -1\r
                                                        end\r
-                                                       debug( "error during ssl handshake:", err )  \r
+                                                       debug( "error during ssl handshake:", err ) \r
                                                        if err == "wantwrite" then\r
                                                                event = EV_WRITE\r
                                                        elseif err == "wantread" then\r
@@ -248,7 +249,7 @@ do
                        return true\r
        end\r
        function interface_mt:_destroy()  -- close this interface + events and call last listener\r
-                       debug( "closing client with id:", self )\r
+                       debug( "closing client with id:", self.id )\r
                        self:_lock( true, true, true )  -- first of all, lock the interface to avoid further actions\r
                        local _\r
                        _ = self.eventread and self.eventread:close( )  -- close events; this must be called outside of the event callbacks!\r
@@ -274,6 +275,7 @@ do
                        interfacelist( "delete", self )\r
                        return true\r
        end\r
+       \r
        function interface_mt:_lock(nointerface, noreading, nowriting)  -- lock or unlock this interface or events\r
                        self.nointerface, self.noreading, self.nowriting = nointerface, noreading, nowriting\r
                        return nointerface, noreading, nowriting\r
@@ -288,7 +290,8 @@ do
        \r
        -- Public methods\r
        function interface_mt:write(data)\r
-               --vdebug( "try to send data to client, id/data:", self, data )\r
+               if self.nowriting then return nil, "locked" end\r
+               --vdebug( "try to send data to client, id/data:", self.id, data )\r
                data = tostring( data )\r
                local len = string_len( data )\r
                local total = len + self.writebufferlen\r
@@ -306,7 +309,8 @@ do
                return true\r
        end\r
        function interface_mt:close(now)\r
-               debug( "try to close client connection with id:", self )\r
+               if self.nointerface then return nil, "locked"; end\r
+               debug( "try to close client connection with id:", self.id )\r
                if self.type == "client" then\r
                        self.fatalerror = "client to close"\r
                        if ( not self.eventwrite ) or now then  -- try to close immediately\r
@@ -319,7 +323,7 @@ do
                                return nil, "writebuffer not empty, waiting"\r
                        end\r
                else\r
-                       debug( "try to close server with id:", self, "args:", now )\r
+                       debug( "try to close server with id:", self.id, "args:", now )\r
                        self.fatalerror = "server to close"\r
                        self:_lock( true )\r
                        local count = 0\r
@@ -353,7 +357,7 @@ do
        end\r
        \r
        function interface_mt:ssl()\r
-               return self.usingssl\r
+               return self._usingssl\r
        end\r
 \r
        function interface_mt:type()\r
@@ -368,22 +372,25 @@ do
                return self.addr\r
        end\r
        \r
-                       \r
+       function interface_mt:set_sslctx(sslctx)\r
+               self._sslctx = sslctx;\r
+       end\r
        \r
        function interface_mt:starttls()\r
-               debug( "try to start ssl at client id:", self )\r
+               debug( "try to start ssl at client id:", self.id )\r
                local err\r
-               if not self.sslctx then  -- no ssl available\r
+               if not self._sslctx then  -- no ssl available\r
                        err = "no ssl context available"\r
-               elseif self.usingssl then  -- startssl was already called\r
+               elseif self._usingssl then  -- startssl was already called\r
                        err = "ssl already active"\r
                end\r
                if err then\r
                        debug( "error:", err )\r
                        return nil, err      \r
                end\r
-               self.usingssl = true\r
+               self._usingssl = true\r
                self.startsslcallback = function( )  -- we have to start the handshake outside of a read/write event\r
+                       self.startsslcallback = nil\r
                        self:_start_ssl();\r
                        self.eventstarthandshake = nil\r
                        return -1\r
@@ -443,6 +450,7 @@ do
                        _sslctx = sslctx; -- parameters\r
                        _usingssl = false;  -- client is using ssl;\r
                }\r
+               interface.id = tostring(interface):match("%x+$");\r
                interface.writecallback = function( event )  -- called on write events\r
                        --vdebug( "new client write event, id/ip/port:", interface, ip, port )\r
                        if interface.nowriting or ( interface.fatalerror and ( "client to close" ~= interface.fatalerror ) ) then  -- leave this event\r
@@ -457,7 +465,7 @@ do
                                interface.eventwrite = false\r
                                return -1\r
                        else  -- can write :)\r
-                               if interface.usingssl then  -- handle luasec\r
+                               if interface._usingssl then  -- handle luasec\r
                                        if interface.eventreadtimeout then  -- we have to read first\r
                                                local ret = interface.readcallback( )  -- call readcallback\r
                                                --vdebug( "tried to read in writecallback, result:", ret )\r
@@ -467,7 +475,7 @@ do
                                                interface.eventwritetimeout = false\r
                                        end\r
                                end\r
-                               local succ, err, byte = interface.send( interface.conn, interface.writebuffer, 1, interface.writebufferlen )\r
+                               local succ, err, byte = interface.conn:send( interface.writebuffer, 1, interface.writebufferlen )\r
                                --vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte )\r
                                if succ then  -- writing succesful\r
                                        interface.writebuffer = ""\r
@@ -508,7 +516,7 @@ do
                                end\r
                        end\r
                end\r
-               local usingssl, receive = interface._usingssl, interface.receive;\r
+               \r
                interface.readcallback = function( event )  -- called on read events\r
                        --vdebug( "new client read event, id/ip/port:", interface, ip, port )\r
                        if interface.noreading or interface.fatalerror then  -- leave this event\r
@@ -523,7 +531,7 @@ do
                                interface.eventread = nil\r
                                return -1\r
                        else -- can read\r
-                               if usingssl then  -- handle luasec\r
+                               if interface._usingssl then  -- handle luasec\r
                                        if interface.eventwritetimeout then  -- ok, in the past writecallback was regged\r
                                                local ret = interface.writecallback( )  -- call it\r
                                                --vdebug( "tried to write in readcallback, result:", ret )\r
@@ -533,8 +541,8 @@ do
                                                interface.eventreadtimeout = nil\r
                                        end\r
                                end\r
-                               local buffer, err, part = receive( client, pattern )  -- receive buffer with "pattern"\r
-                               --vdebug( "read data:", buffer, "error:", err, "part:", part )        \r
+                               local buffer, err, part = interface.conn:receive( pattern )  -- receive buffer with "pattern"\r
+                               --vdebug( "read data:", tostring(buffer), "error:", tostring(err), "part:", tostring(part) )        \r
                                buffer = buffer or part or ""\r
                                local len = string_len( buffer )\r
                                if len > cfg.MAX_READ_LENGTH then  -- check buffer length\r
@@ -544,7 +552,7 @@ do
                                        interface.eventread = nil\r
                                        return -1\r
                                end\r
-                               if err and ( "timeout" ~= err ) then\r
+                               if err and ( err ~= "timeout" and err ~= "wantread" ) then\r
                                        if "wantwrite" == err then -- need to read on write event\r
                                                if not interface.eventwrite then  -- register new write event if needed\r
                                                        interface.eventwrite = addevent( base, interface.conn, EV_WRITE, interface.writecallback, cfg.WRITE_TIMEOUT )\r
@@ -591,6 +599,7 @@ do
                        fatalerror = false; -- error message\r
                        nointerface = true;  -- lock/unlock parameter\r
                }\r
+               interface.id = tostring(interface):match("%x+$");\r
                interface.readcallback = function( event )  -- server handler, called on incoming connections\r
                        --vdebug( "server can accept, id/addr/port:", interface, addr, port )\r
                        if interface.fatalerror then\r
@@ -639,9 +648,9 @@ do
 end\r
 \r
 local addserver = ( function( )\r
-       return function( addr, port, listener, pattern, backlog, sslcfg, startssl )  -- TODO: check arguments\r
+       return function( addr, port, listener, pattern, sslcfg, startssl )  -- TODO: check arguments\r
                --vdebug( "creating new tcp server with following parameters:", addr or "nil", port or "nil", sslcfg or "nil", startssl or "nil")\r
-               local server, err = socket.bind( addr, port, backlog )  -- create server socket\r
+               local server, err = socket.bind( addr, port, cfg.ACCEPT_QUEUE )  -- create server socket\r
                if not server then\r
                        debug( "creating server socket failed because:", err )\r
                        return nil, err\r
index 6ab8ce915ff4346641fc2e0359e52b7731a20d9f..d7970296d8431a412684a967a727990095f245d9 100644 (file)
@@ -166,7 +166,7 @@ wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx, maxco
 \r
     local connections = 0\r
 \r
-    local dispatch, disconnect = listeners.incoming or listeners.listener, listeners.disconnect\r
+    local dispatch, disconnect = listeners.onincoming, listeners.ondisconnect\r
 \r
     local err\r
 \r
@@ -241,7 +241,7 @@ wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx, maxco
         for _, handler in pairs( _socketlist ) do\r
             if handler.serverport == serverport then\r
                 handler.disconnect( handler, "server closed" )\r
-                handler.close( true )\r
+                handler:close( true )\r
             end\r
         end\r
         socket:close( )\r
@@ -300,9 +300,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
 \r
     local ssl\r
 \r
-    local dispatch = listeners.incoming or listeners.listener\r
+    local dispatch = listeners.onincoming\r
     local status = listeners.status\r
-    local disconnect = listeners.disconnect\r
+    local disconnect = listeners.ondisconnect\r
 \r
     local bufferqueue = { }    -- buffer array\r
     local bufferqueuelen = 0    -- end of buffer array\r
@@ -331,9 +331,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
     handler.disconnect = function( )\r
         return disconnect\r
     end\r
-    handler.setlistener = function( listeners )\r
-        dispatch = listeners.incoming\r
-        disconnect = listeners.disconnect\r
+    handler.setlistener = function( self, listeners )\r
+        dispatch = listeners.onincoming\r
+        disconnect = listeners.ondisconnect\r
     end\r
     handler.getstats = function( )\r
         return readtraffic, sendtraffic\r
@@ -400,7 +400,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
     handler.clientport = function( )\r
         return clientport\r
     end\r
-    local write = function( data )\r
+    local write = function( self, data )\r
         bufferlen = bufferlen + string_len( data )\r
         if bufferlen > maxsendlen then\r
             _closelist[ handler ] = "send buffer exceeded"   -- cannot close the client at the moment, have to wait to the end of the cycle\r
@@ -417,26 +417,26 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
         return true\r
     end\r
     handler.write = write\r
-    handler.bufferqueue = function( )\r
+    handler.bufferqueue = function( self )\r
         return bufferqueue\r
     end\r
-    handler.socket = function( )\r
+    handler.socket = function( self )\r
         return socket\r
     end\r
-    handler.pattern = function( new )\r
+    handler.pattern = function( self, new )\r
         pattern = new or pattern\r
         return pattern\r
     end\r
-    handler.setsend = function ( newsend )\r
+    handler.setsend = function ( self, newsend )\r
         send = newsend or send\r
         return send\r
     end\r
-    handler.bufferlen = function( readlen, sendlen )\r
+    handler.bufferlen = function( self, readlen, sendlen )\r
         maxsendlen = sendlen or maxsendlen\r
         maxreadlen = readlen or maxreadlen\r
         return maxreadlen, maxsendlen\r
     end\r
-    handler.lock = function( switch )\r
+    handler.lock = function( self, switch )\r
         if switch == true then\r
             handler.write = idfalse\r
             local tmp = _sendlistlen\r
@@ -507,7 +507,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
             bufferqueuelen = 0\r
             bufferlen = 0\r
             _sendlistlen = removesocket( _sendlist, socket, _sendlistlen )    -- delete socket from writelist\r
-            _ = needtls and handler.starttls(true)\r
+            _ = needtls and handler:starttls(true)\r
             _writetimes[ handler ] = nil\r
            _ = toclose and handler.close( )\r
             return true\r
@@ -529,7 +529,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
 \r
     -- Set the sslctx\r
     local handshake;\r
-    function handler.set_sslctx(new_sslctx)\r
+    function handler.set_sslctx(self, new_sslctx)\r
         ssl = true\r
         sslctx = new_sslctx;\r
         local wrote\r
@@ -564,13 +564,13 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                     end\r
                 end\r
                 disconnect( handler, "ssl handshake failed" )\r
-                _ = handler and handler.close( true )    -- forced disconnect\r
+                _ = handler and handler:close( true )    -- forced disconnect\r
                 return false    -- handshake failed\r
             end\r
         )\r
     end\r
     if sslctx then    -- ssl?\r
-       handler.set_sslctx(sslctx);\r
+       handler:set_sslctx(sslctx);\r
         if startssl then    -- ssl now?\r
             --out_put("server.lua: ", "starting ssl handshake")\r
            local err\r
@@ -590,7 +590,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
         else\r
             -- We're not automatically doing SSL, so we're not secure (yet)\r
             ssl = false\r
-            handler.starttls = function( now )\r
+            handler.starttls = function( self, now )\r
                 if not now then\r
                     --out_put "server.lua: we need to do tls, but delaying until later"\r
                     needtls = true\r
@@ -692,7 +692,7 @@ end
 \r
 ----------------------------------// PUBLIC //--\r
 \r
-addserver = function( listeners, port, addr, pattern, sslctx, maxconnections, startssl )    -- this function provides a way for other scripts to reg a server\r
+addserver = function( addr, port, listeners, pattern, sslctx, startssl )    -- this function provides a way for other scripts to reg a server\r
     local err\r
     --out_put("server.lua: autossl on ", port, " is ", startssl)\r
     if type( listeners ) ~= "table" then\r
@@ -715,7 +715,7 @@ addserver = function( listeners, port, addr, pattern, sslctx, maxconnections, st
         out_error( "server.lua, port ", port, ": ", err )\r
         return nil, err\r
     end\r
-    local handler, err = wrapserver( listeners, server, addr, port, pattern, sslctx, maxconnections, startssl )    -- wrap new server socket\r
+    local handler, err = wrapserver( listeners, server, addr, port, pattern, sslctx, _maxclientsperserver, startssl )    -- wrap new server socket\r
     if not handler then\r
         server:close( )\r
         return nil, err\r
@@ -737,14 +737,14 @@ removeserver = function( port )
     if not handler then\r
         return nil, "no server found on port '" .. tostring( port ) .. "'"\r
     end\r
-    handler.close( )\r
+    handler:close( )\r
     _server[ port ] = nil\r
     return true\r
 end\r
 \r
 closeall = function( )\r
     for _, handler in pairs( _socketlist ) do\r
-        handler.close( )\r
+        handler:close( )\r
         _socketlist[ _ ] = nil\r
     end\r
     _readlistlen = 0\r
@@ -822,7 +822,7 @@ loop = function( )    -- this is the main loop of the program
         end\r
         for handler, err in pairs( _closelist ) do\r
             handler.disconnect( )( handler, err )\r
-            handler.close( true )    -- forced disconnect\r
+            handler:close( true )    -- forced disconnect\r
         end\r
         clean( _closelist )\r
         _currenttime = os_time( )\r
@@ -880,14 +880,14 @@ addtimer( function( )
                 if os_difftime( _currenttime - timestamp ) > _sendtimeout then\r
                     --_writetimes[ handler ] = nil\r
                     handler.disconnect( )( handler, "send timeout" )\r
-                    handler.close( true )    -- forced disconnect\r
+                    handler:close( true )    -- forced disconnect\r
                 end\r
             end\r
             for handler, timestamp in pairs( _readtimes ) do\r
                 if os_difftime( _currenttime - timestamp ) > _readtimeout then\r
                     --_readtimes[ handler ] = nil\r
                     handler.disconnect( )( handler, "read timeout" )\r
-                    handler.close( )    -- forced disconnect?\r
+                    handler:close( )    -- forced disconnect?\r
                 end\r
             end\r
         end\r
index 417dfd4a43dff5d659f9de251ca1b63a961f5d55..fc0dce2c387694b4080cef1d15b931b21f97f09a 100644 (file)
@@ -100,15 +100,15 @@ local function session_close(session, reason)
                        end
                end
                session.send("</stream:stream>");
-               session.conn.close();
-               xmppclient.disconnect(session.conn, (reason and (reason.text or reason.condition)) or reason or "session closed");
+               session.conn:close();
+               xmppclient.ondisconnect(session.conn, (reason and (reason.text or reason.condition)) or reason or "session closed");
        end
 end
 
 
 -- End of session methods --
 
-function xmppclient.listener(conn, data)
+function xmppclient.onincoming(conn, data)
        local session = sessions[conn];
        if not session then
                session = sm_new_session(conn);
@@ -117,7 +117,7 @@ function xmppclient.listener(conn, data)
                session.log("info", "Client connected");
                
                -- Client is using legacy SSL (otherwise mod_tls sets this flag)
-               if conn.ssl() then
+               if conn:ssl() then
                        session.secure = true;
                end
                
@@ -133,7 +133,7 @@ function xmppclient.listener(conn, data)
        end
 end
        
-function xmppclient.disconnect(conn, err)
+function xmppclient.ondisconnect(conn, err)
        local session = sessions[conn];
        if session then
                (session.log or log)("info", "Client disconnected: %s", err);
index c16f41a09f988c5d7324d67a05d71b710d195c43..b353b1b3f1bdd5bb31bb3dea5d88162ce2f52287 100644 (file)
@@ -118,12 +118,12 @@ local function session_close(session, reason)
                end
                session.send("</stream:stream>");
                session.conn.close();
-               component_listener.disconnect(session.conn, "stream error");
+               component_listener.ondisconnect(session.conn, "stream error");
        end
 end
 
 --- Component connlistener
-function component_listener.listener(conn, data)
+function component_listener.onincoming(conn, data)
        local session = sessions[conn];
        if not session then
                local _send = conn.write;
@@ -157,7 +157,7 @@ function component_listener.listener(conn, data)
        end
 end
        
-function component_listener.disconnect(conn, err)
+function component_listener.ondisconnect(conn, err)
        local session = sessions[conn];
        if session then
                (session.log or log)("info", "component disconnected: %s (%s)", tostring(session.host), tostring(err));
index c7e02ec5a7809b1d0f92b3254d0ac4143bef347b..797ef183fe78ce47664b3c60e0ec1825aae56fd0 100644 (file)
@@ -104,14 +104,14 @@ local function session_close(session, reason)
                        session.conn.close(true); -- Force FIXME: timer?
                end
                session.conn.close();
-               xmppserver.disconnect(session.conn, "stream error");
+               xmppserver.ondisconnect(session.conn, "stream error");
        end
 end
 
 
 -- End of session methods --
 
-function xmppserver.listener(conn, data)
+function xmppserver.onincoming(conn, data)
        local session = sessions[conn];
        if not session then
                session = s2s_new_incoming(conn);
@@ -148,7 +148,7 @@ function xmppserver.status(conn, status)
        end
 end
 
-function xmppserver.disconnect(conn, err)
+function xmppserver.ondisconnect(conn, err)
        local session = sessions[conn];
        if session then
                if err and err ~= "closed" and session.srv_hosts then
index 8a45080341ec32afc70e91658a40f7f5ef49794c..706b42c948429d279b48220e7f570f9402bda0f8 100644 (file)
@@ -20,9 +20,9 @@ module:add_handler("c2s_unauthed", "starttls", xmlns_starttls,
                                session.send(st.stanza("proceed", { xmlns = xmlns_starttls }));
                                session:reset_stream();
                                if session.host and hosts[session.host].ssl_ctx_in then
-                                       session.conn.set_sslctx(hosts[session.host].ssl_ctx_in);
+                                       session.conn:set_sslctx(hosts[session.host].ssl_ctx_in);
                                end
-                               session.conn.starttls();
+                               session.conn:starttls();
                                session.log("info", "TLS negotiation started...");
                                session.secure = false;
                        else
@@ -37,9 +37,9 @@ module:add_handler("s2sin_unauthed", "starttls", xmlns_starttls,
                                session.sends2s(st.stanza("proceed", { xmlns = xmlns_starttls }));
                                session:reset_stream();
                                if session.to_host and hosts[session.to_host].ssl_ctx_in then
-                                       session.conn.set_sslctx(hosts[session.to_host].ssl_ctx_in);
+                                       session.conn:set_sslctx(hosts[session.to_host].ssl_ctx_in);
                                end
-                               session.conn.starttls();
+                               session.conn:starttls();
                                session.log("info", "TLS negotiation started for incoming s2s...");
                                session.secure = false;
                        else
@@ -91,7 +91,7 @@ module:hook_stanza(xmlns_starttls, "proceed",
                        module:log("debug", "Proceeding with TLS on s2sout...");
                        local format, to_host, from_host = string.format, session.to_host, session.from_host;
                        session:reset_stream();
-                       session.conn.starttls(true);
+                       session.conn:starttls(true);
                        session.secure = false;
                        return true;
                end);