]> git.proxmox.com Git - ceph.git/blob - ceph/src/civetweb/test/websocket.lua
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / civetweb / test / websocket.lua
1 timerID = "timeout"
2 --timerID = "interval"
3
4 function trace(text)
5 local f = io.open("websocket.trace", "a")
6 f:write(os.date() .. " - " .. text .. "\n")
7 f:close()
8 end
9
10 function iswebsocket()
11 return mg.lua_type == "websocket"
12 --return pcall(function()
13 -- if (string.upper(mg.request_info.http_headers.Upgrade)~="WEBSOCKET") then error("") end
14 --end)
15 end
16
17 trace("called with Lua type " .. tostring(mg.lua_type))
18
19 if not iswebsocket() then
20 trace("no websocket")
21 mg.write("HTTP/1.0 403 Forbidden\r\n")
22 mg.write("Connection: close\r\n")
23 mg.write("\r\n")
24 mg.write("forbidden")
25 return
26 end
27
28
29 -- Serialize table to string
30 function ser(val)
31 local t
32 if type(val) == "table" then
33 for k,v in pairs(val) do
34 if t then
35 t = t .. ", " .. ser(k) .. "=" .. ser(v)
36 else
37 t = "{" .. ser(k) .. "=" .. ser(v)
38 end
39 end
40 t = t .. "}"
41 else
42 t = tostring(val)
43 end
44 return t
45 end
46
47 -- table of all active connection
48 allConnections = {}
49
50 -- function to get a client identification string
51 function who(tab)
52 local ri = allConnections[tab.client].request_info
53 return ri.remote_addr .. ":" .. ri.remote_port
54 end
55
56 -- Callback to accept or reject a connection
57 function open(tab)
58 allConnections[tab.client] = tab
59 trace("open[" .. who(tab) .. "]: " .. ser(tab))
60 return true -- return true to accept the connection
61 end
62
63 -- Callback for "Websocket ready"
64 function ready(tab)
65 trace("ready[" .. who(tab) .. "]: " .. ser(tab))
66 mg.write(tab.client, "text", "Websocket ready")
67 mg.write(tab.client, 1, "-->h 180");
68 mg.write(tab.client, "-->m 180");
69 senddata()
70 if timerID == "timeout" then
71 mg.set_timeout("timer()", 1)
72 elseif timerID == "interval" then
73 mg.set_interval("timer()", 1)
74 end
75 return true -- return true to keep the connection open
76 end
77
78 -- Callback for "Websocket received data"
79 function data(tab)
80 trace("data[" .. who(tab) .. "]: " .. ser(tab))
81 senddata()
82 return true -- return true to keep the connection open
83 end
84
85 -- Callback for "Websocket is closing"
86 function close(tab)
87 trace("close[" .. who(tab) .. "]: " .. ser(tab))
88 mg.write("text", "end")
89 allConnections[tab.client] = nil
90 end
91
92 function senddata()
93 local date = os.date('*t');
94 local hand = (date.hour%12)*60+date.min;
95
96 mg.write("text", string.format("%u:%02u:%02u", date.hour, date.min, date.sec));
97
98 if (hand ~= lasthand) then
99 mg.write(1, string.format("-->h %u", hand*360/(12*60)));
100 mg.write( string.format("-->m %u", date.min*360/60));
101 lasthand = hand;
102 end
103
104 if bits and content then
105 data(bits, content)
106 end
107 end
108
109 function timer()
110 trace("timer")
111 senddata()
112 if timerID == "timeout" then
113 mg.set_timeout("timer()", 1)
114 else
115 return true -- return true to keep an interval timer running
116 end
117 end
118