-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
120 lines (104 loc) · 3.04 KB
/
server.js
File metadata and controls
120 lines (104 loc) · 3.04 KB
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
var http = require('http');
var cookie = require( "ext/cookie-node" );
var paperboy = require( "ext/node-paperboy" );
var sys = require('sys');
var path = require('path');
var done_ops = {};
var oplist = [];
var opowners = {};
var PORT = 9292;
var WEBROOT = path.join(path.dirname(__filename), 'public');
console.log("serving public files from " + WEBROOT);
http.createServer(function (request, response) {
if (request.url.split('/')[1] == 'public') { //kind of a hack, but oh well
request.url = request.url.slice(7);
do_paperboy(request, response);
} else
switch (request.method)
{
case 'GET':
pop_op(request, response);
break;
case 'POST':
request.on('data', push_op);
break;
case 'PUT':
request.on('data', return_op);
break;
}
function push_op(chunk)
{
session = setup_session(this, false);
op = JSON.parse(chunk);
op_id = Math.random().toString(36);
op['id'] = op_id;
wrapped_op = {session: session, op: op};
oplist.push(wrapped_op);
opowners[op_id] = session;
response.writeHead(200, {'Content-Type': 'application/json'});
response.end(JSON.stringify({status: 'queued', op_id: op_id}));
}
function pop_op(request, response)
{
session = setup_session(request, response);
op = oplist.shift();
if (op) {
stripped_op = op['op'];
response.writeHead(200, {'Content-Type': 'application/json'});
response.end(JSON.stringify({op: stripped_op}));
} else {
response.writeHead(404, {'Content-Type': 'application/json'});
response.end(JSON.stringify({status: "no op"}));
}
}
function return_op(chunk)
{
session = setup_session(request, response);
op = JSON.parse(chunk);
done_ops[opowners[op.id]] = op;
if (done_ops[session]) {
stripped_op = op['op'];
response.writeHead(200, {'Content-Type': 'application/json'});
response.end(JSON.stringify({status: 'return', return: {id:op.id, value:op.returns}}));
done_ops[session] = null;
} else {
response.writeHead(200, {'Content-Type': 'application/json'});
response.end(JSON.stringify({status: "success"}));
}
}
}).listen(PORT);
function do_paperboy(req, res)
{
var ip = req.connection.remoteAddress;
paperboy
.deliver(WEBROOT, req, res)
.addHeader('Expires', 300)
.addHeader('X-PaperRoute', 'Node')
.before(function() {
sys.log('Received Request')
})
.after(function(statCode) {
console.log(statCode, req.url, ip);
})
.error(function(statCode,msg) {
res.writeHead(statCode, {'Content-Type': 'text/plain'});
res.write("Error: " + statCode);
res.close();
console.log(statCode, req.url, ip, msg);
})
.otherwise(function(err) {
var statCode = 404;
res.writeHead(statCode, {'Content-Type': 'text/plain'});
console.log(statCode, req.url, ip, err);
});
}
function setup_session(request, response)
{
var sess = request.getCookie("session");
if (!sess || sess == "") {
sess = Math.random().toString(36);
response.setCookie("session", sess);
}
return sess;
}
console.log('Server running at http://127.0.0.1:9292/');