aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2012-04-24 19:07:12 +0100
committerMatthew Wild <mwild1@gmail.com>2012-04-24 19:07:12 +0100
commit7cb22f77a78741a1bd085c6b3dc3b31f51c1fa09 (patch)
treeb4ec8ae969375fa44affd63b323a612bb224afb0
parent37f43d0189e9702406bfaf97e8b616f1dd783648 (diff)
downloadprosody-7cb22f77a78741a1bd085c6b3dc3b31f51c1fa09.tar.gz
prosody-7cb22f77a78741a1bd085c6b3dc3b31f51c1fa09.zip
net.http.server: Handle results returned by handlers, and send as a response. Also removes explicit firing of '*', which can now be done via wildcard events.
-rw-r--r--net/http/server.lua32
1 files changed, 20 insertions, 12 deletions
diff --git a/net/http/server.lua b/net/http/server.lua
index 50a5c5a1..185ac9a0 100644
--- a/net/http/server.lua
+++ b/net/http/server.lua
@@ -168,19 +168,27 @@ function handle_request(conn, request, finish_cb)
host = host:match("[^:]*"):lower();
local event = request.method.." "..host..request.path:match("[^?]*");
local payload = { request = request, response = response };
- --[[repeat
- if events.fire_event(event, payload) ~= nil then return; end
- event = (event:sub(-1) == "/") and event:sub(1, -1) or event:gsub("[^/]*$", "");
- if event:sub(-1) == "/" then
- event = event:sub(1, -1);
- else
- event = event:gsub("[^/]*$", "");
+ --log("debug", "Firing event: %s", event);
+ local result = events.fire_event(event, payload);
+ if result ~= nil then
+ if result ~= true then
+ local code, body = 200, "";
+ local result_type = type(result);
+ if result_type == "number" then
+ response.status_code = result;
+ elseif result_type == "string" then
+ body = result;
+ elseif result_type == "table" then
+ body = result.body;
+ result.body = nil;
+ for k, v in pairs(result) do
+ response[k] = v;
+ end
+ end
+ response:send(body);
end
- until not event:find("/", 1, true);]]
- --log("debug", "Event: %s", event);
- if events.fire_event(event, payload) ~= nil then return; end
- -- TODO try adding/stripping / at the end, but this needs to work via an HTTP redirect
- if events.fire_event("*", payload) ~= nil then return; end
+ return;
+ end
end
-- if handler not called, fallback to legacy httpserver handlers