aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2018-09-23 18:59:04 +0200
committerKim Alvefur <zash@zash.se>2018-09-23 18:59:04 +0200
commit9f0ece7fc61b428ba42381b23f454b974ce1953f (patch)
tree3618f8ecc03bcb74719869ceb1cad2a79fbda379
parent6e9777081fff906edd2021c674bfa14d05799c21 (diff)
downloadprosody-9f0ece7fc61b428ba42381b23f454b974ce1953f.tar.gz
prosody-9f0ece7fc61b428ba42381b23f454b974ce1953f.zip
net.http.server: Delay host checks until after host-less event
This allows handling events without any hosts enabled.
-rw-r--r--net/http/server.lua27
1 files changed, 18 insertions, 9 deletions
diff --git a/net/http/server.lua b/net/http/server.lua
index 5b42208c..b73f3385 100644
--- a/net/http/server.lua
+++ b/net/http/server.lua
@@ -217,14 +217,6 @@ function handle_request(conn, request, finish_cb)
local err_code, err;
if not request.path then
err_code, err = 400, "Invalid path";
- elseif not hosts[host] then
- if hosts[default_host] then
- host = default_host;
- elseif host then
- err_code, err = 404, "Unknown host: "..host;
- else
- err_code, err = 400, "Missing or invalid 'Host' header";
- end
end
if err then
@@ -234,11 +226,28 @@ function handle_request(conn, request, finish_cb)
end
local global_event = request.method.." "..request.path:match("[^?]*");
- local host_event = request.method.." "..host..request.path:match("[^?]*");
+
local payload = { request = request, response = response };
log("debug", "Firing event: %s", global_event);
local result = events.fire_event(global_event, payload);
if result == nil then
+ if not hosts[host] then
+ if hosts[default_host] then
+ host = default_host;
+ elseif host then
+ err_code, err = 404, "Unknown host: "..host;
+ else
+ err_code, err = 400, "Missing or invalid 'Host' header";
+ end
+ end
+ local host_event = request.method.." "..host..request.path:match("[^?]*");
+
+ if err then
+ response.status_code = err_code;
+ response:send(events.fire_event("http-error", { code = err_code, message = err, response = response }));
+ return;
+ end
+
log("debug", "Firing event: %s", host_event);
result = events.fire_event(host_event, payload);
end