117 local function cors_handler(event_data) |
117 local function cors_handler(event_data) |
118 local request, response = event_data.request, event_data.response; |
118 local request, response = event_data.request, event_data.response; |
119 apply_cors_headers(response, opt_methods, opt_headers, opt_max_age, request.headers.origin); |
119 apply_cors_headers(response, opt_methods, opt_headers, opt_max_age, request.headers.origin); |
120 end |
120 end |
121 |
121 |
|
122 local function options_handler(event_data) |
|
123 cors_handler(event_data); |
|
124 return ""; |
|
125 end |
|
126 |
122 for key, handler in pairs(event.item.route or {}) do |
127 for key, handler in pairs(event.item.route or {}) do |
123 local event_name = get_http_event(host, app_path, key); |
128 local event_name = get_http_event(host, app_path, key); |
124 if event_name then |
129 if event_name then |
|
130 local options_event_name = event_name:gsub("^%S+", "OPTIONS"); |
125 if type(handler) ~= "function" then |
131 if type(handler) ~= "function" then |
126 local data = handler; |
132 local data = handler; |
127 handler = function () return data; end |
133 handler = function () return data; end |
128 elseif event_name:sub(-2, -1) == "/*" then |
134 elseif event_name:sub(-2, -1) == "/*" then |
129 local base_path_len = #event_name:match("/.+$"); |
135 local base_path_len = #event_name:match("/.+$"); |
138 end |
144 end |
139 if not app_handlers[event_name] then |
145 if not app_handlers[event_name] then |
140 app_handlers[event_name] = handler; |
146 app_handlers[event_name] = handler; |
141 module:hook_object_event(server, event_name, handler); |
147 module:hook_object_event(server, event_name, handler); |
142 module:hook_object_event(server, event_name, cors_handler, 1); |
148 module:hook_object_event(server, event_name, cors_handler, 1); |
|
149 module:hook_object_event(server, options_event_name, options_handler, -1); |
143 else |
150 else |
144 module:log("warn", "App %s added handler twice for '%s', ignoring", app_name, event_name); |
151 module:log("warn", "App %s added handler twice for '%s', ignoring", app_name, event_name); |
145 end |
152 end |
146 else |
153 else |
147 module:log("error", "Invalid route in %s, %q. See https://prosody.im/doc/developers/http#routes", app_name, key); |
154 module:log("error", "Invalid route in %s, %q. See https://prosody.im/doc/developers/http#routes", app_name, key); |