scansion.serve: Add support for chunked encoding (thanks Zash)

Mon, 17 Sep 2018 22:07:19 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 17 Sep 2018 22:07:19 +0100
changeset 156
807dc9c0f140
parent 155
84aa28dda508
child 157
b35dc87ebff0

scansion.serve: Add support for chunked encoding (thanks Zash)

scansion/serve.lua file | annotate | diff | comparison | revisions
--- a/scansion/serve.lua	Mon Sep 17 22:06:27 2018 +0100
+++ b/scansion/serve.lua	Mon Sep 17 22:07:19 2018 +0100
@@ -4,6 +4,7 @@
 local http_server = require "net.http.server";
 local http = require "net.http";
 local json = require "util.json";
+local time = require "socket".gettime;
 
 function handle_request()
 	return "Hello world";
@@ -11,22 +12,29 @@
 
 local function run(config, run_script)
 	function handle_run_request(event)
-		local data = json.decode(event.request.body);
-		if not data then
-			return 400;
+		local request, response = event.request, event.response;
+
+		local function log(type, data)
+			local entry = { type = type, data = data, time = time() };
+			local chunk = json.encode(entry) .. "\r\n";
+			response.conn:write(("%x\r\n%s\r\n"):format(#chunk, chunk));
 		end
 	
-		if not data.script then
-			return 400;
+		response.status_code = 201;
+		response.headers.connection = "close";
+		response.headers.transfer_encoding = "chunked";
+		response.conn:send(table.concat(http_server.prepare_header(response)));
+
+		local ok, ret = pcall(run_script, "web", event.request.body, log);
+	
+		if not ok then
+			log("error", ret);
 		end
 
-		local ok, ret = pcall(run_script, "web", data.script);
+		response.conn:write("0\r\n\r\n");
+		response:done();
 	
-		if not ok then
-			return json.encode({ error = true, message = ret });
-		end
-	
-		return json.encode(ret);
+		return true;
 	end
 	
 	http_server.add_host("localhost");
@@ -39,7 +47,7 @@
 	--http_server.add_handler("GET localhost/stream/*", handle_stream_request);
 	http_server.listen_on(config.port or 8007);
 	verse.log("debug", "Ready")
-	verse.loop();
+	repeat until not verse.loop();
 end
 
 return {

mercurial