Software /
code /
prosody-modules
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 | 609:edb4afb6a227 |
children | 611: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)