-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver2.mini
More file actions
81 lines (68 loc) · 2.19 KB
/
server2.mini
File metadata and controls
81 lines (68 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import: glib("gir/GLib")
import: soup("gir/Soup@3.0")
import: gobject("gir/GObject")
import: minijs("fmt/minijs")
import: json("fmt/json")
logger: log("main")
let Server := soup::Server()
def MimeTypes := {
"xhtml" is "application/xhtml+xml",
"js" is "text/javascript",
"css" is "text/css",
"ico" is "image/png"
}
fun serve_static_content(Message, Path, MimeType) do
log::info("GET", Path)
let Channel := glib::IOChannel::new_file(Path, "r")
Channel:set_encoding(nil)
let (_, Content, Length) := Channel:read_to_end
Channel:close
Message:set_response(MimeType, soup::MemoryUse::static, Content)
Message:set_status(200, nil)
on Error do
log::error(Error)
Message:set_status(404, nil)
end
Server:add_handler("/"; Server, Message, Path, Query, Client) do
serve_static_content(Message, "index.xhtml", MimeTypes["xhtml"])
end
Server:add_handler("/minilang.js"; Server, Message, Path, Query, Client) do
serve_static_content(Message, "minilang.js", MimeTypes["js"])
end
Server:add_handler("/test.js"; Server, Message, Path, Query, Client) do
serve_static_content(Message, "test.js", MimeTypes["js"])
end
let Globals := map(globals()):grow({
"print" is external("print"),
"json" is external("json")
})
let Externals := external::set()
Externals:add("print", print)
print('Globals = {Globals}\n')
Server:add_handler("/compile"; Server, Message, Path, Query, Client) do
let Parser := parser()
let Compiler := compiler(global)
let Body := string(Message:get_request_body:flatten:get_data)
log::info("Body", Body)
let Form := soup::form_decode(Body)
log::info("Input", Form)
Parser:input(Form["input"])
do
let Function := Parser:compile(Compiler)
Message:set_response("application/json", soup::MemoryUse::static, json::encode(minijs::encode(Function, Externals)))
Message:set_status(200, nil)
on Error do
let Buffer := string::buffer()
Buffer:write('{Error:type}\n')
Buffer:write('{Error:message}\n')
for (Source, Line) in Error:trace do
Buffer:write('\t{Source}:{Line}\n')
end
log::error(Error)
Message:set_response("text/plain", soup::MemoryUse::static, Buffer:rest)
Message:set_status(404, nil)
end
end
Server:listen_all(9001, nil)
log::info("Listening on http://localhost:9001")
callcc(0)