net.http.server: Delay host checks until after host-less event
authorKim Alvefur <zash@zash.se>
Sun, 23 Sep 2018 18:59:04 +0200
changeset 9382 866cba3689f4
parent 9381 a6f54df39624
child 9383 7425af27fc67
net.http.server: Delay host checks until after host-less event This allows handling events without any hosts enabled.
net/http/server.lua
--- a/net/http/server.lua	Sat Sep 22 00:02:16 2018 +0200
+++ b/net/http/server.lua	Sun Sep 23 18:59:04 2018 +0200
@@ -217,14 +217,6 @@
 	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 @@
 	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