-
Notifications
You must be signed in to change notification settings - Fork 72
/
Copy pathapp.js
119 lines (104 loc) · 2.85 KB
/
app.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
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
var http = require('http');
var amqp = require('amqp');
var URL = require('url');
var htmlEscape = require('sanitizer/sanitizer').escape;
function rabbitUrl() {
if (process.env.VCAP_SERVICES) {
var svcInfo = JSON.parse(process.env.VCAP_SERVICES);
for (var label in svcInfo) {
var svcs = svcInfo[label];
for (var index in svcs) {
var uri = svcs[index].credentials.uri;
if (uri.lastIndexOf("amqp", 0) == 0) {
return uri;
}
}
}
return null;
}
else {
return "amqp://localhost";
}
}
var port = process.env.VCAP_APP_PORT || 3000;
var messages = [];
function setup() {
var exchange = conn.exchange('cf-demo', {'type': 'fanout', durable: false}, function() {
var queue = conn.queue('', {durable: false, exclusive: true},
function() {
queue.subscribe(function(msg) {
messages.push(htmlEscape(msg.body));
if (messages.length > 10) {
messages.shift();
}
});
queue.bind(exchange.name, '');
});
queue.on('queueBindOk', function() { httpServer(exchange); });
});
}
function httpServer(exchange) {
var serv = http.createServer(function(req, res) {
var url = URL.parse(req.url);
if (req.method == 'GET' && url.pathname == '/env') {
printEnv(res);
}
else if (req.method == 'GET' && url.pathname == '/') {
res.statusCode = 200;
openHtml(res);
writeForm(res);
writeMessages(res);
closeHtml(res);
}
else if (req.method == 'POST' && url.pathname == '/') {
chunks = '';
req.on('data', function(chunk) { chunks += chunk; });
req.on('end', function() {
msg = unescapeFormData(chunks.split('=')[1]);
exchange.publish('', {body: msg});
res.statusCode = 303;
res.setHeader('Location', '/');
res.end();
});
}
else {
res.statusCode = 404;
res.end("This is not the page you were looking for.");
}
});
serv.listen(port);
}
console.log("Starting ... AMQP URL: " + rabbitUrl());
var conn = amqp.createConnection({url: rabbitUrl()});
conn.on('ready', setup);
// ---- helpers
function openHtml(res) {
res.write("<html><head><title>Node.JS / RabbitMQ demo</title></head><body>");
}
function closeHtml(res) {
res.end("</body></html>");
}
function writeMessages(res) {
res.write('<h2>Messages</h2>');
res.write('<ol>');
for (i in messages) {
res.write('<li>' + messages[i] + '</li>');
}
res.write('</ol>');
}
function writeForm(res) {
res.write('<form method="post">');
res.write('<input name="data"/><input type="submit"/>');
res.write('</form>');
}
function printEnv(res) {
res.statusCode = 200;
openHtml(res);
for (entry in process.env) {
res.write(entry + "=" + process.env[entry] + "<br/>");
}
closeHtml(res);
}
function unescapeFormData(msg) {
return unescape(msg.replace('+', ' '));
}