Compare commits

...

1 Commits

2 changed files with 49 additions and 32 deletions
+1 -12
View File
@@ -27,19 +27,8 @@ var Driver = {
return Server.http.apply(Server, arguments);
},
isSecureRequest: function(request) {
return Server.isSecureRequest(request);
},
isWebSocket: function(request) {
if (request.method !== 'GET') return false;
var connection = request.headers.connection || '',
upgrade = request.headers.upgrade || '';
return request.method === 'GET' &&
connection.toLowerCase().split(/ *, */).indexOf('upgrade') >= 0 &&
upgrade.toLowerCase() === 'websocket';
return Server.isWebSocket(request);
},
validateOptions: function(options, validKeys) {
+48 -20
View File
@@ -71,6 +71,54 @@ var instance = {
for (var key in instance)
Server.prototype[key] = instance[key];
Server.http = function(request, options) {
options = options || {};
if (options.requireMasking === undefined) options.requireMasking = true;
var klass = this.getDriverClass(request),
url = this.determineUrl(request);
return klass && new klass(request, url, options);
};
Server.isWebSocket = function(request) {
var klass = this.getDriverClass(request);
return !!klass;
};
Server.getDriverClass = function(request) {
var headers = request.headers;
var connection = headers['connection'] || '',
key = headers['sec-websocket-key'],
key1 = headers['sec-websocket-key1'],
key2 = headers['sec-websocket-key2'],
origin = headers['origin'],
upgrade = headers['upgrade'] || '',
version = headers['sec-websocket-version'];
if (request.method !== 'GET' ||
connection.toLowerCase().split(/ *, */).indexOf('upgrade') < 0 ||
upgrade.toLowerCase() !== 'websocket')
return null;
if (typeof version === 'string' || typeof key === 'string')
return (version === '13' && key.length > 0) ? Hybi : null;
if (typeof origin !== 'string' || origin.length === 0)
return null;
if (typeof key1 === 'string' && typeof key2 === 'string')
return Draft76;
return Draft75;
};
Server.determineUrl = function(request) {
var scheme = this.isSecureRequest(request) ? 'wss:' : 'ws:';
return scheme + '//' + request.headers.host + request.url;
};
Server.isSecureRequest = function(request) {
if (request.connection && request.connection.authorized !== undefined) return true;
if (request.socket && request.socket.secure) return true;
@@ -85,24 +133,4 @@ Server.isSecureRequest = function(request) {
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,
url = this.determineUrl(request);
if (headers['sec-websocket-version'])
return new Hybi(request, url, options);
else if (headers['sec-websocket-key1'])
return new Draft76(request, url, options);
else
return new Draft75(request, url, options);
};
module.exports = Server;