| 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;
 
 
  |