thinkjs/lib/Lib/Util/WebSocket.js
2014-05-28 10:48:22 +08:00

64 lines
1.6 KiB
JavaScript

var EventEmitter = require('events').EventEmitter;
var crypto = require('crypto');
var GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
var WebSocket = module.exports = Class().inherits(EventEmitter).extend(function(){
"use strict";
return {
init: function(request, socket){
EventEmitter.call(this);
this.request = request;
this.socket = socket || request.socket;
},
handshake: function(){
var headers = this.request.headers;
var secKey = headers['sec-websocket-key'];
if (!secKey) {
return;
}
var accept = WebSocket.generateAccept(secKey);
var sendHeaders = [
'HTTP/1.1 101 Switching Protocols',
'Upgrade: websocket',
'Connection: Upgrade',
'Sec-WebSocket-Accept: ' + accept,
'',
''
];
var buffer = new Buffer(sendHeaders.join('\r\n'), 'utf8');
this.socket.write(buffer);
},
run: function(){
this.handshake();
this.socket.on("data", function(data){
console.log(data.toString());
})
}
};
});
/**
* 是否是websocket请求
* @param {[type]} req [description]
* @return {Boolean} [description]
*/
WebSocket.isWebSocket = function(request){
"use strict";
if (request.method !== 'GET') {
return false;
}
var connection = request.headers.connection || "";
var upgrade = request.headers.upgrade || "";
return connection.toLowerCase().indexOf('upgrade') > -1 && upgrade.toLowerCase() === 'websocket';
};
/**
* [generateAccept description]
* @param {[type]} key [description]
* @return {[type]} [description]
*/
WebSocket.generateAccept = function(key){
var sha1 = crypto.createHash('sha1');
sha1.update(key + GUID);
return sha1.digest('base64');
}