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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
-- a helper for handling API results: throws an error if the call
-- was unsuccessful, otherwise returns the result
function must(...)
local ok, result = ...
if not ok then
error(result)
end
return result
end
-- open a database connection
local db = must(luna.db.open("file:db.sqlite?_journal=WAL&_sync=NORMAL"))
must(luna.db.exec(db, [[
CREATE TABLE IF NOT EXISTS hits(creation_time DATETIME NOT NULL);
]], {}))
-- register a GET / route that displays a home page for the example site
luna.router.route("GET /", function (request)
local response = "{\"method\": \"" .. request.method .. "\""
response = response .. ", \"path\": \"" .. request.path .. "\"}"
return 200, {["Content-Type"] = "text/html"}, [[
<!DOCTYPE html>
<html>
<head>
<title>A simple example of website made for luna</title>
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
<main class="container">
<h1>Wow! A simple website made for luna?</h1>
<nav>
<div class="menu-link">
<a href="/json">JSON example</a> — print basic request data
in JSON format
</div>
<div class="menu-link">
<a href="/db">DB example</a> — write a hit into the database
and return overall number of hits
</div>
<div class="menu-link">
<a href="/request">HTTP request</a> — send an HTTP-request
to ifconfig.me and return the result
</div>
</nav>
</main>
</body>
</html>]]
end)
-- register a GET /json route and return some request data in response
luna.router.route("GET /json", function (request)
local response = "{\"method\": \"" .. request.method .. "\""
response = response .. ", \"path\": \"" .. request.path .. "\"}"
return 200, {["Content-Type"] = "application/json"}, response
end)
-- register a GET /db route. visiting it writes a hit to the database and
-- displays visits count
luna.router.route("GET /db", function (request)
local ok, err = luna.db.exec(
db,
"INSERT INTO hits VALUES (?)",
{os.date("%Y-%m-%d %H:%M:%S")}
)
if not ok then
return 500,
{["Content-Type"] = "application/json"},
"error while saving to db: " .. err
end
local ok, res = luna.db.query(db, "SELECT COUNT(*) FROM hits", {})
if not ok then
return 500,
{["Content-Type"] = "application/json"},
"error while querying db: " .. res
end
return 200, {["Content-Type"] = "text/html"}, "Hits: " .. tostring(res[1][1])
end)
-- register a GET /request route. when visited makes an HTTP-request to
-- https://ifconfig.me service and displays the result
luna.router.route("GET /request", function ()
local ok, response = luna.http.request("GET", "https://ifconfig.me", {}, "")
if not ok then
return 500,
{["Content-Type"] = "application/json"},
"error while fetching data from ifconfig.me: " .. response
end
return 200, {}, "Your IP is: " .. response.body
end)
-- serve static files from static/ directory. also cache them on the client
-- side for 1 hour.
luna.router.static("GET /static/", "static/", "public, immutable, max-age=3600")
-- register a custom eval handler that will evaluate whatever is passed into
-- luna stdio when it's run with -D flag. in this case we print the result of
-- evaluation. eval handler is evaluated once for each worker so the result
-- may be printed more than once
luna.onEval(function (text)
local res = (_G.loadstring or _G.load)(text)
res()
end)
|