3 var util = require('util'),
4 HttpParser = require('../http_parser'),
5 Base = require('./base'),
6 Draft75 = require('./draft75'),
7 Draft76 = require('./draft76'),
8 Hybi = require('./hybi');
10 var Server = function(options) {
11 Base.call(this, null, null, options);
12 this._http = new HttpParser('request');
14 util.inherits(Server, Base);
17 EVENTS: ['open', 'message', 'error', 'close'],
19 _bindEventListeners: function() {
20 this.messages.on('error', function() {});
21 this.on('error', function() {});
24 parse: function(chunk) {
25 if (this._delegate) return this._delegate.parse(chunk);
27 this._http.parse(chunk);
28 if (!this._http.isComplete()) return;
30 this.method = this._http.method;
31 this.url = this._http.url;
32 this.headers = this._http.headers;
33 this.body = this._http.body;
36 this._delegate = Server.http(this, this._options);
37 this._delegate.messages = this.messages;
38 this._delegate.io = this.io;
41 this.EVENTS.forEach(function(event) {
42 this._delegate.on(event, function(e) { self.emit(event, e) });
45 this.protocol = this._delegate.protocol;
46 this.version = this._delegate.version;
48 this.parse(this._http.body);
49 this.emit('connect', new Base.ConnectEvent());
53 this.__queue.forEach(function(msg) {
54 this._delegate[msg[0]].apply(this._delegate, msg[1]);
60 ['addExtension', 'setHeader', 'start', 'frame', 'text', 'binary', 'ping', 'close'].forEach(function(method) {
61 instance[method] = function() {
63 return this._delegate[method].apply(this._delegate, arguments);
65 this.__queue.push([method, arguments]);
71 for (var key in instance)
72 Server.prototype[key] = instance[key];
74 Server.isSecureRequest = function(request) {
75 if (request.connection && request.connection.authorized !== undefined) return true;
76 if (request.socket && request.socket.secure) return true;
78 var headers = request.headers;
79 if (!headers) return false;
80 if (headers['https'] === 'on') return true;
81 if (headers['x-forwarded-ssl'] === 'on') return true;
82 if (headers['x-forwarded-scheme'] === 'https') return true;
83 if (headers['x-forwarded-proto'] === 'https') return true;
88 Server.determineUrl = function(request) {
89 var scheme = this.isSecureRequest(request) ? 'wss:' : 'ws:';
90 return scheme + '//' + request.headers.host + request.url;
93 Server.http = function(request, options) {
94 options = options || {};
95 if (options.requireMasking === undefined) options.requireMasking = true;
97 var headers = request.headers,
98 url = this.determineUrl(request);
100 if (headers['sec-websocket-version'])
101 return new Hybi(request, url, options);
102 else if (headers['sec-websocket-key1'])
103 return new Draft76(request, url, options);
105 return new Draft75(request, url, options);
108 module.exports = Server;