comunicationLeap/node_modules/ws/test/testserver.js
node_modules/ws/test/testserver.jsRaw
1var http = require('http')
2 , util = require('util')
3 , crypto = require('crypto')
4 , events = require('events')
5 , Sender = require('../lib/Sender')
6 , Receiver = require('../lib/Receiver');
7
8module.exports = {
9 handlers: {
10 valid: validServer,
11 invalidKey: invalidRequestHandler,
12 closeAfterConnect: closeAfterConnectHandler,
13 return401: return401
14 },
15 createServer: function(port, handler, cb) {
16 if (handler && !cb) {
17 cb = handler;
18 handler = null;
19 }
20 var webServer = http.createServer(function (req, res) {
21 res.writeHead(200, {'Content-Type': 'text/plain'});
22 res.end('okay');
23 });
24 var srv = new Server(webServer);
25 webServer.on('upgrade', function(req, socket) {
26 webServer._socket = socket;
27 (handler || validServer)(srv, req, socket);
28 });
29 webServer.listen(port, '127.0.0.1', function() { cb(srv); });
30 }
31};
32
33/**
34 * Test strategies
35 */
36
37function validServer(server, req, socket) {
38 if (typeof req.headers.upgrade === 'undefined' ||
39 req.headers.upgrade.toLowerCase() !== 'websocket') {
40 throw new Error('invalid headers');
41 return;
42 }
43
44 if (!req.headers['sec-websocket-key']) {
45 socket.end();
46 throw new Error('websocket key is missing');
47 }
48
49 // calc key
50 var key = req.headers['sec-websocket-key'];
51 var shasum = crypto.createHash('sha1');
52 shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
53 key = shasum.digest('base64');
54
55 var headers = [
56 'HTTP/1.1 101 Switching Protocols'
57 , 'Upgrade: websocket'
58 , 'Connection: Upgrade'
59 , 'Sec-WebSocket-Accept: ' + key
60 ];
61
62 socket.write(headers.concat('', '').join('\r\n'));
63 socket.setTimeout(0);
64 socket.setNoDelay(true);
65
66 var sender = new Sender(socket);
67 var receiver = new Receiver();
68 receiver.ontext = function (message, flags) {
69 server.emit('message', message, flags);
70 sender.send(message);
71 };
72 receiver.onbinary = function (message, flags) {
73 flags = flags || {};
74 flags.binary = true;
75 server.emit('message', message, flags);
76 sender.send(message, {binary: true});
77 };
78 receiver.onping = function (message, flags) {
79 flags = flags || {};
80 server.emit('ping', message, flags);
81 };
82 receiver.onpong = function (message, flags) {
83 flags = flags || {};
84 server.emit('pong', message, flags);
85 };
86 receiver.onclose = function (code, message, flags) {
87 flags = flags || {};
88 server.emit('close', code, message, flags);
89 };
90 socket.on('data', function (data) {
91 receiver.add(data);
92 });
93 socket.on('end', function() {
94 socket.end();
95 });
96}
97
98function invalidRequestHandler(server, req, socket) {
99 if (typeof req.headers.upgrade === 'undefined' ||
100 req.headers.upgrade.toLowerCase() !== 'websocket') {
101 throw new Error('invalid headers');
102 return;
103 }
104
105 if (!req.headers['sec-websocket-key']) {
106 socket.end();
107 throw new Error('websocket key is missing');
108 }
109
110 // calc key
111 var key = req.headers['sec-websocket-key'];
112 var shasum = crypto.createHash('sha1');
113 shasum.update(key + "bogus");
114 key = shasum.digest('base64');
115
116 var headers = [
117 'HTTP/1.1 101 Switching Protocols'
118 , 'Upgrade: websocket'
119 , 'Connection: Upgrade'
120 , 'Sec-WebSocket-Accept: ' + key
121 ];
122
123 socket.write(headers.concat('', '').join('\r\n'));
124 socket.end();
125}
126
127function closeAfterConnectHandler(server, req, socket) {
128 if (typeof req.headers.upgrade === 'undefined' ||
129 req.headers.upgrade.toLowerCase() !== 'websocket') {
130 throw new Error('invalid headers');
131 return;
132 }
133
134 if (!req.headers['sec-websocket-key']) {
135 socket.end();
136 throw new Error('websocket key is missing');
137 }
138
139 // calc key
140 var key = req.headers['sec-websocket-key'];
141 var shasum = crypto.createHash('sha1');
142 shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
143 key = shasum.digest('base64');
144
145 var headers = [
146 'HTTP/1.1 101 Switching Protocols'
147 , 'Upgrade: websocket'
148 , 'Connection: Upgrade'
149 , 'Sec-WebSocket-Accept: ' + key
150 ];
151
152 socket.write(headers.concat('', '').join('\r\n'));
153 socket.end();
154}
155
156
157function return401(server, req, socket) {
158 var headers = [
159 'HTTP/1.1 401 Unauthorized'
160 , 'Content-type: text/html'
161 ];
162
163 socket.write(headers.concat('', '').join('\r\n'));
164 socket.end();
165}
166
167/**
168 * Server object, which will do the actual emitting
169 */
170
171function Server(webServer) {
172 this.webServer = webServer;
173}
174
175util.inherits(Server, events.EventEmitter);
176
177Server.prototype.close = function() {
178 this.webServer.close();
179 if (this._socket) this._socket.end();
180}