summaryrefslogtreecommitdiffstats
path: root/src/civetweb/test/websocket.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/civetweb/test/websocket.lua')
-rw-r--r--src/civetweb/test/websocket.lua118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/civetweb/test/websocket.lua b/src/civetweb/test/websocket.lua
new file mode 100644
index 00000000..7338ed87
--- /dev/null
+++ b/src/civetweb/test/websocket.lua
@@ -0,0 +1,118 @@
+timerID = "timeout"
+--timerID = "interval"
+
+function trace(text)
+ local f = io.open("websocket.trace", "a")
+ f:write(os.date() .. " - " .. text .. "\n")
+ f:close()
+end
+
+function iswebsocket()
+ return mg.lua_type == "websocket"
+ --return pcall(function()
+ -- if (string.upper(mg.request_info.http_headers.Upgrade)~="WEBSOCKET") then error("") end
+ --end)
+end
+
+trace("called with Lua type " .. tostring(mg.lua_type))
+
+if not iswebsocket() then
+ trace("no websocket")
+ mg.write("HTTP/1.0 403 Forbidden\r\n")
+ mg.write("Connection: close\r\n")
+ mg.write("\r\n")
+ mg.write("forbidden")
+ return
+end
+
+
+-- Serialize table to string
+function ser(val)
+ local t
+ if type(val) == "table" then
+ for k,v in pairs(val) do
+ if t then
+ t = t .. ", " .. ser(k) .. "=" .. ser(v)
+ else
+ t = "{" .. ser(k) .. "=" .. ser(v)
+ end
+ end
+ t = t .. "}"
+ else
+ t = tostring(val)
+ end
+ return t
+end
+
+-- table of all active connection
+allConnections = {}
+
+-- function to get a client identification string
+function who(tab)
+ local ri = allConnections[tab.client].request_info
+ return ri.remote_addr .. ":" .. ri.remote_port
+end
+
+-- Callback to accept or reject a connection
+function open(tab)
+ allConnections[tab.client] = tab
+ trace("open[" .. who(tab) .. "]: " .. ser(tab))
+ return true -- return true to accept the connection
+end
+
+-- Callback for "Websocket ready"
+function ready(tab)
+ trace("ready[" .. who(tab) .. "]: " .. ser(tab))
+ mg.write(tab.client, "text", "Websocket ready")
+ mg.write(tab.client, 1, "-->h 180");
+ mg.write(tab.client, "-->m 180");
+ senddata()
+ if timerID == "timeout" then
+ mg.set_timeout("timer()", 1)
+ elseif timerID == "interval" then
+ mg.set_interval("timer()", 1)
+ end
+ return true -- return true to keep the connection open
+end
+
+-- Callback for "Websocket received data"
+function data(tab)
+ trace("data[" .. who(tab) .. "]: " .. ser(tab))
+ senddata()
+ return true -- return true to keep the connection open
+end
+
+-- Callback for "Websocket is closing"
+function close(tab)
+ trace("close[" .. who(tab) .. "]: " .. ser(tab))
+ mg.write("text", "end")
+ allConnections[tab.client] = nil
+end
+
+function senddata()
+ local date = os.date('*t');
+ local hand = (date.hour%12)*60+date.min;
+
+ mg.write("text", string.format("%u:%02u:%02u", date.hour, date.min, date.sec));
+
+ if (hand ~= lasthand) then
+ mg.write(1, string.format("-->h %u", hand*360/(12*60)));
+ mg.write( string.format("-->m %u", date.min*360/60));
+ lasthand = hand;
+ end
+
+ if bits and content then
+ data(bits, content)
+ end
+end
+
+function timer()
+ trace("timer")
+ senddata()
+ if timerID == "timeout" then
+ mg.set_timeout("timer()", 1)
+ else
+ return true -- return true to keep an interval timer running
+ end
+end
+