summaryrefslogtreecommitdiffstats
path: root/src/civetweb/test/ws_status.lua
blob: a19505b237fbd0ec0c45b3461a4859df32c34eec (plain)
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
if mg.lua_type ~= "websocket" then
  mg.write("HTTP/1.0 200 OK\r\n")
  mg.write("Connection: close\r\n")
  mg.write("\r\n")
  mg.write("<!DOCTYPE HTML>\r\n")
  mg.write("<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n")
  mg.write("<head>\r\n")
  mg.write("<meta charset=\"UTF-8\"></meta>\r\n")
  mg.write("<title>Server stats</title>\r\n")
  mg.write("</head>\r\n")
  mg.write("<body onload=\"load()\">\r\n")
  mg.write([====[
  <script type="text/javascript">

    var connection;
    var data_field;

    function webSockKeepAlive() {
      if (keepAlive) {
        connection.send('Ok');
        setTimeout("webSockKeepAlive()", 10000);
      }
    }

    function load() {
      var wsproto = (location.protocol === 'https:') ? "wss:" : "ws:";
      connection = new WebSocket(wsproto + "//" + window.location.host + window.location.pathname);
      data_field = document.getElementById('data');

      data_field.innerHTML = "wait for data";

      use_keepAlive = true;

      connection.onopen = function () {
        keepAlive = use_keepAlive;
        webSockKeepAlive();
      };

      // Log errors
      connection.onerror = function (error) {
        keepAlive = false;
        alert("WebSocket error");
        connection.close();
      };

      // Log messages from the server
      connection.onmessage = function (e) {
          data_field.innerHTML = e.data;
      };
    }

</script>
]====])

  mg.write("<div id='data'>Wait for page load</div>\r\n")
  mg.write("</body>\r\n")
  mg.write("</html>\r\n")
  return
end


function table.count(tab)
  local count = 0
  for _ in pairs(tab) do
    count = count + 1
  end
  return count
end


-- table of all active connection
allConnections = {}
connCount = table.count(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
  connCount = table.count(allConnections)
  return true -- return true to accept the connection
end

-- Callback for "Websocket ready"
function ready(tab)
  senddata()
  return true -- return true to keep the connection open
end

-- Callback for "Websocket received data"
function data(tab)
    senddata()
    return true -- return true to keep the connection open
end

-- Callback for "Websocket is closing"
function close(tab)
    allConnections[tab.client] = nil
    connCount = table.count(allConnections)
end

function senddata()
    local date = os.date('*t');

    collectgarbage("collect"); -- Avoid adding uncollected Lua memory from this state

    mg.write(string.format([[
{"Time": "%u:%02u:%02u",
 "Date": "%04u-%02u-%02u",
 "Context": %s,
 "Common": %s,
 "System": \"%s\",
 "ws_status": {"Memory": %u, "Connections": %u}
}]],
date.hour, date.min, date.sec,
date.year, date.month, date.day,
mg.get_info("context"), 
mg.get_info("common"), 
mg.get_info("system"),
collectgarbage("count")*1024,
connCount
));

end

function timer()
    senddata()
    mg.set_timeout("timer()", 1)    
end

mg.set_timeout("timer()", 1)