diff --git a/lib/Lib/Util/WebSocket.js b/lib/Lib/Util/WebSocket.js index ef143841..9d349720 100644 --- a/lib/Lib/Util/WebSocket.js +++ b/lib/Lib/Util/WebSocket.js @@ -1,8 +1,39 @@ -var WebSocket = Class(function(){ +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){ + 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()); + }) } }; }); @@ -17,7 +48,16 @@ WebSocket.isWebSocket = function(request){ return false; } var connection = request.headers.connection || ""; - var upgrade = request.headers.upgrade; + var upgrade = request.headers.upgrade || ""; return connection.toLowerCase().indexOf('upgrade') > -1 && upgrade.toLowerCase() === 'websocket'; }; -module.exports = WebSocket; \ No newline at end of file +/** + * [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'); +} diff --git a/package.json b/package.json index 2683096c..a97c440b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "thinkjs", "description": "A MVC Web Framework For Node.js", - "version": "0.5.23", + "version": "0.5.25", "author": { "name": "welefen", "email": "welefen@gmail.com"