mirror of
https://github.com/thinkjs/thinkjs.git
synced 2026-01-25 14:42:47 +00:00
64 lines
1.6 KiB
JavaScript
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');
|
|
}
|