changeset 610:50dc20e96a78

mod_cleanup_http: "spring cleans" module, aka unload global http modules without hassle (open ports cleanup doesn't work with server_event)
author Marco Cirillo <maranda@lightwitch.org>
date Sun, 12 Feb 2012 18:04:51 +0000
parents edb4afb6a227
children d87a9e1e6d30
files mod_cleanup_http/mod_cleanup_http.lua
diffstat 1 files changed, 39 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_cleanup_http/mod_cleanup_http.lua	Sun Feb 12 18:04:51 2012 +0000
@@ -0,0 +1,39 @@
+-- Auto-cleanup BOSH stuff module is added globally.
+
+module:set_global()
+
+local http_modules = module:get_option("cleanup_http_modules", {})
+if type(http_modules) ~= "table" then module:log("error", "cleanup_http_modules needs to be a module.") ; return false end
+
+local function cleanup(data)
+	if data.module == "cleanup_http" then -- it's us getting unloaded destroy handler.
+		prosody.events.remove_handler("module-unloaded", cleanup)
+	elseif http_modules[data.module] then
+		local ports = http_modules[data.module]
+
+		module:log("debug", "Cleaning up http handlers and ports as module %s is being unloaded.", data.module)
+		for _, options in ipairs(ports) do
+			if options.port then
+                        	httpserver.new.http_servers[options.port].handlers[options.path or "register_account"] = nil
+			end
+		end
+
+		-- if there are no handlers left clean and close the socket, doesn't work with server_event
+		local event = require "core.configmanager".get("*", "core", "use_libevent")
+
+		if not event then
+        	        for _, options in ipairs(ports) do
+                	        if options.port and not next(httpserver.new.http_servers[options.port].handlers) then
+                        	        httpserver.new.http_servers[options.port] = nil
+					if options.interface then
+						for _, value in ipairs(options.interface) do
+							if server.getserver(value, options.port) then server.removeserver(value, options.port) end
+						end
+					else if server.getserver("*", options.port) then server.removeserver("*", options.port) end end
+				end
+			end
+		end
+	end
+end
+
+prosody.events.add_handler("module-unloaded", cleanup)