Commit d4b1c3fd3a74779de65a3e13c33c9b0da781a243
1 parent
69cfdd07
now the session livetime is shown with a bar, as well as the current session id.…
… These are updated on reload or ajax call.
Showing
8 changed files
with
209 additions
and
18 deletions
... | ... | @@ -7,18 +7,36 @@ |
7 | 7 | <link rel="stylesheet" type="text/css" href="/assets/style/common"> |
8 | 8 | <script type="text/javascript" src="/assets/js/jquery"></script> |
9 | 9 | <script type="text/javascript" src="/assets/js/serverval"></script> |
10 | + <script type="text/javascript" src="/assets/js/session"></script> | |
10 | 11 | <script> |
11 | 12 | //<![CDATA[ |
13 | + var sess = null; | |
14 | + | |
12 | 15 | $(document).ready(function() { |
13 | 16 | var sval = new ServerVal("#randval"); |
14 | 17 | |
18 | + sess = new Session("#sessinfo"); | |
19 | + $.getJSON("/sessinfo/", $.proxy(sess.loadJSON, sess)); | |
20 | + | |
15 | 21 | $("ul#menu li:eq(0)").click(function() { |
16 | 22 | sval.start(); |
17 | 23 | }); |
18 | 24 | |
25 | + $("ul#menu li:eq(1)").click(function() { | |
26 | + $("#login").removeClass("hide"); | |
27 | + }); | |
28 | + | |
19 | 29 | $("#randval").click(function() { |
20 | 30 | sval.stop(); |
21 | 31 | }); |
32 | + | |
33 | + $("#login form").submit(function(event) { | |
34 | + event.preventDefault(); | |
35 | + $.post("/login/", | |
36 | + $("#login form").serialize(), | |
37 | + $.proxy(sess.loadJSON, sess)); | |
38 | + $("#login").addClass("hide"); | |
39 | + }); | |
22 | 40 | }); |
23 | 41 | //]]> |
24 | 42 | </script> |
... | ... | @@ -26,7 +44,17 @@ |
26 | 44 | <body> |
27 | 45 | <ul id="menu"> |
28 | 46 | <li>random Value</li> |
47 | + <li>login</li> | |
29 | 48 | </ul> |
49 | + <div id="sessinfo" class="x-small"> | |
50 | + Session: <span></span><br /> | |
51 | + <canvas width="100px" height="3px"></canvas> | |
52 | + </div> | |
53 | + <div id="login" class="hide"> | |
54 | + <form> | |
55 | + <input type="text" name="username" /> | |
56 | + </form> | |
57 | + </div> | |
30 | 58 | <div id="randval" class="hide"> |
31 | 59 | <span class=\"small"> |
32 | 60 | Value created at: <br /> | ... | ... |
... | ... | @@ -33,13 +33,17 @@ ServerVal.prototype.show = function() |
33 | 33 | |
34 | 34 | ServerVal.prototype.start = function() |
35 | 35 | { |
36 | - this.interval = setInterval($.proxy(this.process, this), 1000); | |
36 | + if (null === this.interval) { | |
37 | + this.interval = setInterval($.proxy(this.process, this), 1000); | |
38 | + } | |
37 | 39 | } |
38 | 40 | |
39 | 41 | ServerVal.prototype.process = function() |
40 | 42 | { |
41 | 43 | if (0 >= this.vnext) { |
42 | - $.getJSON("/randval/", $.proxy(this.loadJSON, this)); | |
44 | + $.getJSON("/randval/", $.proxy(this.loadJSON, this)) | |
45 | + .error($.proxy(function() {this.stop();}, this)); | |
46 | + $.getJSON("/sessinfo/", $.proxy(sess.loadJSON, sess)); | |
43 | 47 | } |
44 | 48 | |
45 | 49 | else { | ... | ... |
assets/js/session.js
0 → 100644
1 | +function Session(sId) | |
2 | +{ | |
3 | + this.eSid = $(sId + " span"); | |
4 | + this.canvas = $(sId + " canvas").get(0); | |
5 | + this.context = this.canvas.getContext("2d"); | |
6 | + | |
7 | + this.id = "none" | |
8 | + this.timeout = 0; | |
9 | + this.timeleft = 0; | |
10 | + this.interval = null; | |
11 | + | |
12 | + this.draw(); | |
13 | +} | |
14 | + | |
15 | +Session.prototype.loadJSON = function(data) | |
16 | +{ | |
17 | + this.id = ("0" == data.id)? "none" : data.id; | |
18 | + this.timeout = data.timeout; | |
19 | + this.timeleft = data.timeleft; | |
20 | + | |
21 | + this.draw(); | |
22 | + if (0 < this.timeleft) | |
23 | + this.start(); | |
24 | +} | |
25 | + | |
26 | +Session.prototype.draw = function() | |
27 | +{ | |
28 | + this.eSid.empty().append(this.id); | |
29 | + | |
30 | + this.context.fillStyle = "rgb(255, 0, 0)"; | |
31 | + this.context.fillRect(0, 0, this.canvas.width, this.canvas.height); | |
32 | + | |
33 | + this.context.fillStyle = "rgb(0, 255, 0)"; | |
34 | + this.context.fillRect(0, 0, | |
35 | + this.canvas.width / this.timeout * this.timeleft, | |
36 | + this.canvas.height); | |
37 | +} | |
38 | + | |
39 | +Session.prototype.start = function() | |
40 | +{ | |
41 | + if (null === this.interval) { | |
42 | + this.interval = setInterval($.proxy(this.process, this), 1000); | |
43 | + } | |
44 | +} | |
45 | + | |
46 | +Session.prototype.process = function() | |
47 | +{ | |
48 | + if (0 >= this.timeleft) { | |
49 | + this.stop(); | |
50 | + } | |
51 | + | |
52 | + else { | |
53 | + this.timeleft--; | |
54 | + this.draw(); | |
55 | + } | |
56 | +} | |
57 | + | |
58 | +Session.prototype.stop = function() | |
59 | +{ | |
60 | + clearInterval(this.interval); | |
61 | + this.interval = null; | |
62 | + this.id = "none"; | |
63 | + this.timeout = 0; | |
64 | + this.timeleft = 0; | |
65 | + | |
66 | + this.draw(); | |
67 | +} | |
68 | + | |
69 | +// vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -8,14 +8,22 @@ div#randval { |
8 | 8 | border-radius: 10px; |
9 | 9 | } |
10 | 10 | |
11 | -div.hide#randval { | |
12 | - top: -500px; | |
11 | +div#login { | |
12 | + position: fixed; | |
13 | +} | |
14 | + | |
15 | +div.hide { | |
16 | + top: -500px !important; | |
13 | 17 | } |
14 | 18 | |
15 | 19 | .small { |
16 | 20 | font-size: small; |
17 | 21 | } |
18 | 22 | |
23 | +.x-small { | |
24 | + font-size: x-small; | |
25 | +} | |
26 | + | |
19 | 27 | ul#menu { |
20 | 28 | list-style: none inside; |
21 | 29 | margin: 0px; |
... | ... | @@ -38,4 +46,9 @@ ul#menu li { |
38 | 46 | float: left; |
39 | 47 | margin-right: 1px; |
40 | 48 | } |
49 | + | |
50 | +div#sessinfo canvas { | |
51 | + border: 1px solid black; | |
52 | +} | |
53 | + | |
41 | 54 | /* vim: set st=4 sw=4: */ | ... | ... |
... | ... | @@ -29,6 +29,7 @@ |
29 | 29 | |
30 | 30 | #include "class.h" |
31 | 31 | #include "http/message.h" |
32 | +#include "session.h" | |
32 | 33 | |
33 | 34 | |
34 | 35 | CLASS(HttpResponse) { |
... | ... | @@ -47,6 +48,7 @@ HttpResponse httpResponse403(); |
47 | 48 | HttpResponse httpResponseMe(); |
48 | 49 | HttpResponse httpResponseLoginForm(); |
49 | 50 | HttpResponse httpResponseRandval(time_t, int); |
51 | +HttpResponse httpResponseSession(Session); | |
50 | 52 | HttpResponse httpResponseAsset( |
51 | 53 | const char *, |
52 | 54 | const char *, size_t, | ... | ... |
... | ... | @@ -30,7 +30,8 @@ RESP = http/response.c \ |
30 | 30 | http/response/403.c \ |
31 | 31 | http/response/login_form.c \ |
32 | 32 | http/response/asset.c \ |
33 | - http/response/randval.c | |
33 | + http/response/randval.c \ | |
34 | + http/response/session.c | |
34 | 35 | PARSER = http/parser.c \ |
35 | 36 | http/parser/parse.c \ |
36 | 37 | http/parser/new_message.c \ | ... | ... |
src/http/response/session.c
0 → 100644
1 | +/** | |
2 | + * \file | |
3 | + * | |
4 | + * \author Georg Hopp | |
5 | + * | |
6 | + * \copyright | |
7 | + * Copyright (C) 2012 Georg Hopp | |
8 | + * | |
9 | + * This program is free software: you can redistribute it and/or modify | |
10 | + * it under the terms of the GNU General Public License as published by | |
11 | + * the Free Software Foundation, either version 3 of the License, or | |
12 | + * (at your option) any later version. | |
13 | + * | |
14 | + * This program is distributed in the hope that it will be useful, | |
15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | + * GNU General Public License for more details. | |
18 | + * | |
19 | + * You should have received a copy of the GNU General Public License | |
20 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 | + */ | |
22 | + | |
23 | +#include <stdlib.h> | |
24 | +#include <string.h> | |
25 | +#include <stdio.h> | |
26 | +#include <time.h> | |
27 | +#include <sys/types.h> | |
28 | + | |
29 | +#include "class.h" | |
30 | +#include "interface/class.h" | |
31 | + | |
32 | +#include "http/response.h" | |
33 | +#include "http/message.h" | |
34 | +#include "http/header.h" | |
35 | +#include "session.h" | |
36 | + | |
37 | +#include "utils/memory.h" | |
38 | + | |
39 | +#define RESP_DATA "{\"id\":\"%lu\",\"timeout\":%d,\"timeleft\":%ld}" | |
40 | + | |
41 | +HttpResponse | |
42 | +httpResponseSession(Session session) | |
43 | +{ | |
44 | + char buffer[200]; | |
45 | + HttpResponse response; | |
46 | + HttpMessage message; | |
47 | + size_t nbuf; | |
48 | + | |
49 | + response = new(HttpResponse, "HTTP/1.1", 200, "OK"); | |
50 | + message = (HttpMessage)response; | |
51 | + | |
52 | + httpHeaderAdd(&(message->header), | |
53 | + new(HttpHeader, CSTRA("Content-Type"), CSTRA("application/json"))); | |
54 | + | |
55 | + message->type = HTTP_MESSAGE_BUFFERED; | |
56 | + | |
57 | + nbuf = sprintf(buffer, RESP_DATA, | |
58 | + (NULL != session)? session->id : 0, | |
59 | + (NULL != session)? SESSION_LIVETIME : 0, | |
60 | + (NULL != session)? session->livetime - time(NULL) : 0); | |
61 | + | |
62 | + message->nbody = nbuf; | |
63 | + message->body = malloc(nbuf); | |
64 | + memcpy(message->body, buffer, nbuf); | |
65 | + | |
66 | + return response; | |
67 | +} | |
68 | + | |
69 | +// vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -24,6 +24,7 @@ |
24 | 24 | #include <stdio.h> |
25 | 25 | #include <stdlib.h> |
26 | 26 | #include <time.h> |
27 | +#include <sys/time.h> | |
27 | 28 | |
28 | 29 | #include "class.h" |
29 | 30 | #include "interface/class.h" |
... | ... | @@ -91,7 +92,7 @@ httpWorkerProcess(HttpWorker this, Stream st) |
91 | 92 | } |
92 | 93 | |
93 | 94 | if (0 == strcmp("POST", request->method)) { |
94 | - if (0 == strcmp("/me/", request->uri)) { | |
95 | + if (0 == strcmp("/login/", request->uri)) { | |
95 | 96 | char * delim = memchr(rmessage->body, '=', rmessage->nbody); |
96 | 97 | char * val; |
97 | 98 | size_t nkey, nval; |
... | ... | @@ -108,10 +109,7 @@ httpWorkerProcess(HttpWorker this, Stream st) |
108 | 109 | new(Session, val, nval)); |
109 | 110 | nbuf = sprintf(buffer, "sid=%lu;Path=/", this->session->id); |
110 | 111 | |
111 | - response = httpWorkerGetAsset( | |
112 | - request, | |
113 | - "./assets/html/main.html", | |
114 | - CSTRA("text/html")); | |
112 | + response = (HttpMessage)httpResponseSession(this->session); | |
115 | 113 | |
116 | 114 | httpHeaderAdd( |
117 | 115 | &(response->header), |
... | ... | @@ -121,10 +119,6 @@ httpWorkerProcess(HttpWorker this, Stream st) |
121 | 119 | |
122 | 120 | if (0 == strcmp("GET", request->method)) { |
123 | 121 | |
124 | - if (0 == strcmp("/login/", request->uri)) { | |
125 | - response = (HttpMessage)httpResponseLoginForm(); | |
126 | - } | |
127 | - | |
128 | 122 | if (0 == strcmp("/", request->uri)) { |
129 | 123 | response = httpWorkerGetAsset( |
130 | 124 | request, |
... | ... | @@ -132,14 +126,18 @@ httpWorkerProcess(HttpWorker this, Stream st) |
132 | 126 | CSTRA("text/html")); |
133 | 127 | } |
134 | 128 | |
129 | + if (0 == strcmp("/sessinfo/", request->uri)) { | |
130 | + response = (HttpMessage)httpResponseSession(this->session); | |
131 | + } | |
132 | + | |
135 | 133 | if (0 == strcmp("/randval/", request->uri)) { |
136 | - //if (NULL != this->session) { | |
134 | + if (NULL != this->session) { | |
137 | 135 | response = (HttpMessage)httpResponseRandval( |
138 | 136 | this->val->timestamp, |
139 | 137 | this->val->value); |
140 | - //} else { | |
141 | - // response = (HttpMessage)httpResponse403(); | |
142 | - //} | |
138 | + } else { | |
139 | + response = (HttpMessage)httpResponse403(); | |
140 | + } | |
143 | 141 | } |
144 | 142 | |
145 | 143 | if (0 == strcmp("/image/me", request->uri)) { |
... | ... | @@ -163,6 +161,13 @@ httpWorkerProcess(HttpWorker this, Stream st) |
163 | 161 | CSTRA("text/javascript")); |
164 | 162 | } |
165 | 163 | |
164 | + if (0 == strcmp("/assets/js/session", request->uri)) { | |
165 | + response = httpWorkerGetAsset( | |
166 | + request, | |
167 | + "./assets/js/session.js", | |
168 | + CSTRA("text/javascript")); | |
169 | + } | |
170 | + | |
166 | 171 | if (0 == strcmp("/assets/style/common", request->uri)) { |
167 | 172 | response = httpWorkerGetAsset( |
168 | 173 | request, | ... | ... |
Please
register
or
login
to post a comment