# HG changeset patch # User Matthew Wild # Date 1537218439 -3600 # Node ID 807dc9c0f140e0c37b99bdcb087c32d66eae0ebd # Parent 84aa28dda5088d44b1ee6af0668ee86c1b234c15 scansion.serve: Add support for chunked encoding (thanks Zash) diff -r 84aa28dda508 -r 807dc9c0f140 scansion/serve.lua --- 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 {