-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
69 lines (53 loc) · 1.2 KB
/
server.js
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
var recent = [];
var index = {};
var crypto = require('crypto');
var express = require('express');
var cors = require('cors');
var app = express()
.disable('etag')
.use(express.logger('dev'))
.use(cors())
.use(express.static(__dirname + '/public'));
app.get('/recent', list);
app.post('/',
express.json({ strict: false }),
express.urlencoded(),
create);
app.get('/:id', redirect);
function list(req, res) {
res.send(recent);
}
function create(req, res) {
var url = req.body.url;
if (! url)
return res.send(400, 'Need a url.');
var id = shorten(url);
var entry = index[id] || { id: id, url: url, count: 0 };
var i;
for (i = 0; i < recent.length; ++i)
if (recent[i].id === id)
break;
recent.splice(i, 1);
index[id] = entry;
recent.unshift(entry);
if (recent.length > 10)
recent.pop();
res.send(id);
}
function shorten(url) {
return crypto
.createHash('sha1')
.update(url)
.digest('base64')
.replace(/[=+/]/g, '')
.slice(0, 6);
}
function redirect(req, res, next) {
var id = req.params.id;
var entry = index[id];
if (! entry)
return next();
entry.count++;
res.redirect(entry.url);
}
app.listen(process.env.PORT || 8000);