From 9f0ece7fc61b428ba42381b23f454b974ce1953f Mon Sep 17 00:00:00 2001
From: Kim Alvefur <zash@zash.se>
Date: Sun, 23 Sep 2018 18:59:04 +0200
Subject: net.http.server: Delay host checks until after host-less event

This allows handling events without any hosts enabled.
---
 net/http/server.lua | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

(limited to 'net')

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
-- 
cgit v1.2.3