| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | 'use strict';var util       = require('util'),    HttpParser = require('../http_parser'),    Base       = require('./base'),    Draft75    = require('./draft75'),    Draft76    = require('./draft76'),    Hybi       = require('./hybi');var Server = function(options) {  Base.call(this, null, null, options);  this._http = new HttpParser('request');};util.inherits(Server, Base);var instance = {  EVENTS: ['open', 'message', 'error', 'close', 'ping', 'pong'],  _bindEventListeners: function() {    this.messages.on('error', function() {});    this.on('error', function() {});  },  parse: function(chunk) {    if (this._delegate) return this._delegate.parse(chunk);    this._http.parse(chunk);    if (!this._http.isComplete()) return;    this.method  = this._http.method;    this.url     = this._http.url;    this.headers = this._http.headers;    this.body    = this._http.body;    var self = this;    this._delegate = Server.http(this, this._options);    this._delegate.messages = this.messages;    this._delegate.io = this.io;    this._open();    this.EVENTS.forEach(function(event) {      this._delegate.on(event, function(e) { self.emit(event, e) });    }, this);    this.protocol = this._delegate.protocol;    this.version  = this._delegate.version;    this.parse(this._http.body);    this.emit('connect', new Base.ConnectEvent());  },  _open: function() {    this.__queue.forEach(function(msg) {      this._delegate[msg[0]].apply(this._delegate, msg[1]);    }, this);    this.__queue = [];  }};['addExtension', 'setHeader', 'start', 'frame', 'text', 'binary', 'ping', 'close'].forEach(function(method) {  instance[method] = function() {    if (this._delegate) {      return this._delegate[method].apply(this._delegate, arguments);    } else {      this.__queue.push([method, arguments]);      return true;    }  };});for (var key in instance)  Server.prototype[key] = instance[key];Server.isSecureRequest = function(request) {  if (request.connection && request.connection.authorized !== undefined) return true;  if (request.socket && request.socket.secure) return true;  var headers = request.headers;  if (!headers) return false;  if (headers['https'] === 'on') return true;  if (headers['x-forwarded-ssl'] === 'on') return true;  if (headers['x-forwarded-scheme'] === 'https') return true;  if (headers['x-forwarded-proto'] === 'https') return true;  return false;};Server.determineUrl = function(request) {  var scheme = this.isSecureRequest(request) ? 'wss:' : 'ws:';  return scheme + '//' + request.headers.host + request.url;};Server.http = function(request, options) {  options = options || {};  if (options.requireMasking === undefined) options.requireMasking = true;  var headers = request.headers,      version = headers['sec-websocket-version'],      key     = headers['sec-websocket-key'],      key1    = headers['sec-websocket-key1'],      key2    = headers['sec-websocket-key2'],      url     = this.determineUrl(request);  if (version || key)    return new Hybi(request, url, options);  else if (key1 || key2)    return new Draft76(request, url, options);  else    return new Draft75(request, url, options);};module.exports = Server;
 |