arnaucube
arnaucube/comunicationLeapPublic Self-hosted repository
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}