scansion/serve.lua

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 137
091212cef52a
child 157
b35dc87ebff0
permissions
-rw-r--r--

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

137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local verse = require "verse";
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local server = require "net.server";
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local http_server = require "net.http.server";
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local http = require "net.http";
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local json = require "util.json";
156
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
7 local time = require "socket".gettime;
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 function handle_request()
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 return "Hello world";
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 end
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local function run(config, run_script)
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 function handle_run_request(event)
156
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
15 local request, response = event.request, event.response;
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
16
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
17 local function log(type, data)
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
18 local entry = { type = type, data = data, time = time() };
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
19 local chunk = json.encode(entry) .. "\r\n";
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
20 response.conn:write(("%x\r\n%s\r\n"):format(#chunk, chunk));
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 end
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22
156
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
23 response.status_code = 201;
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
24 response.headers.connection = "close";
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
25 response.headers.transfer_encoding = "chunked";
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
26 response.conn:send(table.concat(http_server.prepare_header(response)));
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
27
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
28 local ok, ret = pcall(run_script, "web", event.request.body, log);
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
29
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
30 if not ok then
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
31 log("error", ret);
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33
156
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
34 response.conn:write("0\r\n\r\n");
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
35 response:done();
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36
156
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
37 return true;
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 end
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 http_server.add_host("localhost");
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 http_server.set_default_host("localhost");
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 http_server.add_handler("GET localhost/*", handle_request);
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 http_server.add_handler("POST localhost/run", handle_run_request);
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 http_server.add_handler("http-error", function (e)
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 verse.log("error", "HTTP error: %s", e.code);
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 end);
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 --http_server.add_handler("GET localhost/stream/*", handle_stream_request);
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 http_server.listen_on(config.port or 8007);
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 verse.log("debug", "Ready")
156
807dc9c0f140 scansion.serve: Add support for chunked encoding (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
50 repeat until not verse.loop();
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 end
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 return {
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 run = run;
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 }

mercurial