# HG changeset patch # User Kim Alvefur # Date 1409689991 -7200 # Node ID 57d23c26039b87a31d7ade5d14e803560c71fa7c # Parent 50e5aed4eeea06d2f7bb8bff9cec238c5e7fdf1f# Parent 9ffd582c65d8c2575d557d69717624d4580c5b14 Merge 0.9->0.10 diff -r 50e5aed4eeea -r 57d23c26039b net/http.lua --- a/net/http.lua Tue Sep 02 17:58:12 2014 +0100 +++ b/net/http.lua Tue Sep 02 22:33:11 2014 +0200 @@ -72,6 +72,10 @@ requests[conn] = nil; end +function listener.ondetach(conn) + requests[conn] = nil; +end + local function request_reader(request, data, err) if not request.parser then local function error_cb(reason) diff -r 50e5aed4eeea -r 57d23c26039b net/http/server.lua --- a/net/http/server.lua Tue Sep 02 17:58:12 2014 +0100 +++ b/net/http/server.lua Tue Sep 02 22:33:11 2014 +0200 @@ -142,6 +142,10 @@ sessions[conn] = nil; end +function listener.ondetach(conn) + sessions[conn] = nil; +end + function listener.onincoming(conn, data) sessions[conn]:feed(data); end diff -r 50e5aed4eeea -r 57d23c26039b net/server_event.lua --- a/net/server_event.lua Tue Sep 02 17:58:12 2014 +0100 +++ b/net/server_event.lua Tue Sep 02 22:33:11 2014 +0200 @@ -438,9 +438,11 @@ end function interface_mt:setlistener(listener) - self.onconnect, self.ondisconnect, self.onincoming, self.ontimeout, self.onreadtimeout, self.onstatus - = listener.onconnect, listener.ondisconnect, listener.onincoming, - listener.ontimeout, listener.onreadtimeout, listener.onstatus; + self:ondetach(); -- Notify listener that it is no longer responsible for this connection + self.onconnect, self.ondisconnect, self.onincoming, self.ontimeout, + self.onreadtimeout, self.onstatus, self.ondetach + = listener.onconnect, listener.ondisconnect, listener.onincoming, listener.ontimeout, + listener.onreadtimeout, listener.onstatus, listener.ondetach; end -- Stub handlers @@ -460,6 +462,8 @@ end function interface_mt:ondrain() end + function interface_mt:ondetach() + end function interface_mt:onstatus() end end @@ -487,6 +491,7 @@ ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs onreadtimeout = listener.onreadtimeout; -- called when socket inactivity timeout occurs ondrain = listener.ondrain; -- called when writebuffer is empty + ondetach = listener.ondetach; -- called when disassociating this listener from this connection onstatus = listener.onstatus; -- called for status changes (e.g. of SSL/TLS) eventread = false, eventwrite = false, eventclose = false, eventhandshake = false, eventstarthandshake = false; -- event handler diff -r 50e5aed4eeea -r 57d23c26039b net/server_select.lua --- a/net/server_select.lua Tue Sep 02 17:58:12 2014 +0100 +++ b/net/server_select.lua Tue Sep 02 22:33:11 2014 +0200 @@ -285,6 +285,7 @@ local disconnect = listeners.ondisconnect local drain = listeners.ondrain local onreadtimeout = listeners.onreadtimeout; + local detach = listeners.ondetach local bufferqueue = { } -- buffer array local bufferqueuelen = 0 -- end of buffer array @@ -316,11 +317,15 @@ handler.onreadtimeout = onreadtimeout; handler.setlistener = function( self, listeners ) + if detach then + detach(self) -- Notify listener that it is no longer responsible for this connection + end dispatch = listeners.onincoming disconnect = listeners.ondisconnect status = listeners.onstatus drain = listeners.ondrain handler.onreadtimeout = listeners.onreadtimeout + detach = listeners.ondetach end handler.getstats = function( ) return readtraffic, sendtraffic diff -r 50e5aed4eeea -r 57d23c26039b plugins/mod_admin_telnet.lua --- a/plugins/mod_admin_telnet.lua Tue Sep 02 17:58:12 2014 +0100 +++ b/plugins/mod_admin_telnet.lua Tue Sep 02 22:33:11 2014 +0200 @@ -170,6 +170,10 @@ end end +function console_listener.ondetach(conn) + sessions[conn] = nil; +end + -- Console commands -- -- These are simple commands, not valid standalone in Lua diff -r 50e5aed4eeea -r 57d23c26039b plugins/mod_c2s.lua --- a/plugins/mod_c2s.lua Tue Sep 02 17:58:12 2014 +0100 +++ b/plugins/mod_c2s.lua Tue Sep 02 22:33:11 2014 +0200 @@ -240,9 +240,9 @@ function session.data(data) -- Parse the data, which will store stanzas in session.pending_stanzas if data then - data = filter("bytes/in", data); - if data then - local ok, err = stream:feed(data); + data = filter("bytes/in", data); + if data then + local ok, err = stream:feed(data); if not ok then log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); session:close("not-well-formed"); diff -r 50e5aed4eeea -r 57d23c26039b plugins/mod_component.lua --- a/plugins/mod_component.lua Tue Sep 02 17:58:12 2014 +0100 +++ b/plugins/mod_component.lua Tue Sep 02 22:33:11 2014 +0200 @@ -317,6 +317,10 @@ end end +function listener.ondetach(conn) + sessions[conn] = nil; +end + module:provides("net", { name = "component"; private = true; diff -r 50e5aed4eeea -r 57d23c26039b plugins/mod_net_multiplex.lua --- a/plugins/mod_net_multiplex.lua Tue Sep 02 17:58:12 2014 +0100 +++ b/plugins/mod_net_multiplex.lua Tue Sep 02 22:33:11 2014 +0200 @@ -34,7 +34,6 @@ function listener.onincoming(conn, data) if not data then return; end local buf = buffers[conn]; - buffers[conn] = nil; buf = buf and buf..data or data; for service, multiplex_pattern in pairs(available_services) do if buf:match(multiplex_pattern) then @@ -57,6 +56,8 @@ buffers[conn] = nil; -- warn if no buffer? end +listener.ondetach = listener.ondisconnect; + module:provides("net", { name = "multiplex"; config_prefix = ""; diff -r 50e5aed4eeea -r 57d23c26039b plugins/mod_s2s/mod_s2s.lua --- a/plugins/mod_s2s/mod_s2s.lua Tue Sep 02 17:58:12 2014 +0100 +++ b/plugins/mod_s2s/mod_s2s.lua Tue Sep 02 22:33:11 2014 +0200 @@ -350,8 +350,11 @@ session.notopen = nil; elseif session.direction == "outgoing" then session.notopen = nil; - -- If we are just using the connection for verifying dialback keys, we won't try and auth it - if not attr.id then error("stream response did not give us a streamid!!!"); end + if not attr.id then + log("error", "Stream response did not give us a stream id!"); + session:close({ condition = "undefined-condition", text = "Missing stream ID" }); + return; + end session.streamid = attr.id; if session.secure and not session.cert_chain_status then @@ -617,6 +620,10 @@ initialize_session(session); end +function listener.ondetach(conn) + sessions[conn] = nil; +end + function check_auth_policy(event) local host, session = event.host, event.session; local must_secure = secure_auth;