# HG changeset patch # User Matthew Wild # Date 1536704843 -3600 # Node ID 091212cef52aa06fd828ad534173b03330335053 # Parent 2df38fd36b2bb82f4772584d6f126de13f34cd82 main, scansion.serve: Add mode that serves /run API for executing scripts diff -r 2df38fd36b2b -r 091212cef52a main.lua --- 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); + + diff -r 2df38fd36b2b -r 091212cef52a scansion/serve.lua --- /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; +}