main, scansion.serve: Add mode that serves /run API for executing scripts

Tue, 11 Sep 2018 23:27:23 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Tue, 11 Sep 2018 23:27:23 +0100
changeset 137
091212cef52a
parent 136
2df38fd36b2b
child 138
561f0af6c9dc

main, scansion.serve: Add mode that serves /run API for executing scripts

main.lua file | annotate | diff | comparison | revisions
scansion/serve.lua file | annotate | diff | comparison | revisions
--- a/main.lua	Tue Sep 11 23:25:51 2018 +0100
+++ b/main.lua	Tue Sep 11 23:27:23 2018 +0100
@@ -12,10 +12,11 @@
 local test_metadata = {};
 local server_log_wait_time = 0.2;
 local skip_server_startup_log = false;
-local action_timeout = 5;
+local action_timeout = 10;
 local verse_log_levels = { "warn", "error" };
 local quiet = false;
 local force_summary = false;
+local serve_mode = false;
 
 local property_rules = {};
 
@@ -97,6 +98,10 @@
 			end
 		elseif opt == "--summary" then
 			force_summary = true;
+		elseif opt == "--serve" then
+			serve_mode = 8007;
+		elseif opt == "--serve-port" then
+			serve_mode = assert(tonumber(get_value()), "expected port number");
 		else
 			error("Unhandled command-line option: "..opt);
 		end
@@ -294,6 +299,22 @@
 	return { name = script.title or script_name, status = status, reason = reason };
 end
 
+
+if serve_mode then
+	local have_serve, serve = pcall(require, "scansion.serve");
+
+	if not have_serve then
+		error("This version of scansion was not built with --with-server");
+	end
+
+	initialize_verse(function (e)
+		-- This function handles scansion errors,
+		-- but they shouldn't reach here anyway
+	end);
+	serve.run({ port = serve_mode }, run_test_script);
+	os.exit(0);
+end
+
 log_data("start", { metadata = test_metadata });
 
 local result_tally = { all = {} };
@@ -311,6 +332,7 @@
 
 log_data("end", { time = time(), summary = result_tally });
 
+
 local exit_code = 0;
 if result_tally.error then
 	exit_code = 2;
@@ -319,3 +341,5 @@
 end
 
 os.exit(exit_code);
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scansion/serve.lua	Tue Sep 11 23:27:23 2018 +0100
@@ -0,0 +1,47 @@
+local verse = require "verse";
+
+local server = require "net.server";
+local http_server = require "net.http.server";
+local http = require "net.http";
+local json = require "util.json";
+
+function handle_request()
+	return "Hello world";
+end
+
+local function run(config, run_script)
+	function handle_run_request(event)
+		local data = json.decode(event.request.body);
+		if not data then
+			return 400;
+		end
+	
+		if not data.script then
+			return 400;
+		end
+
+		local ok, ret = pcall(run_script, "web", data.script);
+	
+		if not ok then
+			return json.encode({ error = true, message = ret });
+		end
+	
+		return json.encode(ret);
+	end
+	
+	http_server.add_host("localhost");
+	http_server.set_default_host("localhost");
+	http_server.add_handler("GET localhost/*", handle_request);
+	http_server.add_handler("POST localhost/run", handle_run_request);
+	http_server.add_handler("http-error", function (e)
+		verse.log("error", "HTTP error: %s", e.code);
+	end);
+	--http_server.add_handler("GET localhost/stream/*", handle_stream_request);
+	http_server.listen_on(config.port or 8007);
+	verse.log("debug", "Ready")
+	verse.loop();
+end
+
+return {
+	run = run;
+}

mercurial