Software / code / prosody
Comparison
plugins/mod_http.lua @ 10315:d4c538a7d655
mod_http: Unhook CORS related event handlers
Prevents CORS related handlers from being left over on reload.
BC: `mod_http.apps[app_name][event_name]` is now a table instead of the
main handler function.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 10 Oct 2019 20:46:27 +0200 |
| parent | 10258:4ff2f14f9ac7 |
| child | 10409:abfc05495d8b |
comparison
equal
deleted
inserted
replaced
| 10314:bbc879eab1bf | 10315:d4c538a7d655 |
|---|---|
| 152 module:hook_object_event(server, event_name:sub(1, -3), redir_handler, -1); | 152 module:hook_object_event(server, event_name:sub(1, -3), redir_handler, -1); |
| 153 elseif event_name:sub(-1, -1) == "/" then | 153 elseif event_name:sub(-1, -1) == "/" then |
| 154 module:hook_object_event(server, event_name:sub(1, -2), redir_handler, -1); | 154 module:hook_object_event(server, event_name:sub(1, -2), redir_handler, -1); |
| 155 end | 155 end |
| 156 if not app_handlers[event_name] then | 156 if not app_handlers[event_name] then |
| 157 app_handlers[event_name] = handler; | 157 app_handlers[event_name] = { |
| 158 main = handler; | |
| 159 cors = cors_handler; | |
| 160 options = options_handler; | |
| 161 }; | |
| 158 module:hook_object_event(server, event_name, handler); | 162 module:hook_object_event(server, event_name, handler); |
| 159 module:hook_object_event(server, event_name, cors_handler, 1); | 163 module:hook_object_event(server, event_name, cors_handler, 1); |
| 160 module:hook_object_event(server, options_event_name, options_handler, -1); | 164 module:hook_object_event(server, options_event_name, options_handler, -1); |
| 161 else | 165 else |
| 162 module:log("warn", "App %s added handler twice for '%s', ignoring", app_name, event_name); | 166 module:log("warn", "App %s added handler twice for '%s', ignoring", app_name, event_name); |
| 174 end | 178 end |
| 175 | 179 |
| 176 local function http_app_removed(event) | 180 local function http_app_removed(event) |
| 177 local app_handlers = apps[event.item.name]; | 181 local app_handlers = apps[event.item.name]; |
| 178 apps[event.item.name] = nil; | 182 apps[event.item.name] = nil; |
| 179 for event_name, handler in pairs(app_handlers) do | 183 for event_name, handlers in pairs(app_handlers) do |
| 180 module:unhook_object_event(server, event_name, handler); | 184 module:unhook_object_event(server, event_name, handlers.main); |
| 185 module:unhook_object_event(server, event_name, handlers.cors); | |
| 186 local options_event_name = event_name:gsub("^%S+", "OPTIONS"); | |
| 187 module:unhook_object_event(server, options_event_name, handlers.options); | |
| 181 end | 188 end |
| 182 end | 189 end |
| 183 | 190 |
| 184 module:handle_items("http-provider", http_app_added, http_app_removed); | 191 module:handle_items("http-provider", http_app_added, http_app_removed); |
| 185 | 192 |