diff --git a/lib/faye/websocket/draft75_parser.js b/lib/faye/websocket/draft75_parser.js index a60fa71..d2abe64 100644 --- a/lib/faye/websocket/draft75_parser.js +++ b/lib/faye/websocket/draft75_parser.js @@ -22,8 +22,23 @@ var instance = { }, parse: function(data) { - for (var i = 0, n = data.length; i < n; i++) - this._handleChar(data[i]); + for (var i = 0, n = data.length; i < n; i++) { + switch (data[i]) { + case 0x00: + this._buffering = true; + break; + + case 0xFF: + this._buffer = new Buffer(this._buffer); + this._socket.receive(this._buffer.toString('utf8', 0, this._buffer.length)); + this._buffer = []; + this._buffering = false; + break; + + default: + if (this._buffering) this._buffer.push(data[i]); + } + } }, frame: function(data) { @@ -35,24 +50,6 @@ var instance = { this.FRAME_END.copy(frame, buffer.length + 1); return frame; - }, - - _handleChar: function(data) { - switch (data) { - case 0x00: - this._buffering = true; - break; - - case 0xFF: - this._buffer = new Buffer(this._buffer); - this._socket.receive(this._buffer.toString('utf8', 0, this._buffer.length)); - this._buffer = []; - this._buffering = false; - break; - - default: - if (this._buffering) this._buffer.push(data); - } } }; diff --git a/lib/faye/websocket/protocol8_parser.js b/lib/faye/websocket/protocol8_parser.js index 38725d7..bcb11db 100644 --- a/lib/faye/websocket/protocol8_parser.js +++ b/lib/faye/websocket/protocol8_parser.js @@ -11,7 +11,18 @@ var Protocol8Parser = function(webSocket, options) { this._protocols = options && options.protocols; }; +Protocol8Parser.mask = function(payload, mask, offset) { + if (mask.length === 0) return payload; + offset = offset || 0; + + for (var i = 0, n = payload.length - offset; i < n; i++) { + payload[offset + i] = payload[offset + i] ^ mask[i % 4]; + } + return payload; +}; + var instance = { + BYTE: 255, FIN: 128, MASK: 128, RSV1: 64, @@ -54,7 +65,7 @@ var instance = { handshakeResponse: function() { var secKey = this._socket.request.headers['sec-websocket-key']; - if (!secKey) return; + if (!secKey) return null; var SHA1 = crypto.createHash('sha1'); SHA1.update(secKey + Handshake.GUID); @@ -175,7 +186,7 @@ var instance = { }, frame: function(data, type, code) { - if (this._closed) return; + if (this._closed) return null; var isText = (typeof data === 'string'), opcode = this.OPCODES[type || (isText ? 'text' : 'binary')], @@ -186,6 +197,7 @@ var instance = { offset = header + (this._masking ? 4 : 0), masked = this._masking ? this.MASK : 0, frame = new Buffer(length + offset), + BYTE = this.BYTE, mask, i; frame[0] = this.FIN | opcode; @@ -195,30 +207,29 @@ var instance = { } else if (length <= 65535) { frame[1] = masked | 126; frame[2] = Math.floor(length / 256); - frame[3] = length & 255; + frame[3] = length & BYTE; } else { frame[1] = masked | 127; - frame[2] = Math.floor(length / Math.pow(2,56)) & 255; - frame[3] = Math.floor(length / Math.pow(2,48)) & 255; - frame[4] = Math.floor(length / Math.pow(2,40)) & 255; - frame[5] = Math.floor(length / Math.pow(2,32)) & 255; - frame[6] = Math.floor(length / Math.pow(2,24)) & 255; - frame[7] = Math.floor(length / Math.pow(2,16)) & 255; - frame[8] = Math.floor(length / Math.pow(2,8)) & 255; - frame[9] = length & 255; + frame[2] = Math.floor(length / Math.pow(2,56)) & BYTE; + frame[3] = Math.floor(length / Math.pow(2,48)) & BYTE; + frame[4] = Math.floor(length / Math.pow(2,40)) & BYTE; + frame[5] = Math.floor(length / Math.pow(2,32)) & BYTE; + frame[6] = Math.floor(length / Math.pow(2,24)) & BYTE; + frame[7] = Math.floor(length / Math.pow(2,16)) & BYTE; + frame[8] = Math.floor(length / Math.pow(2,8)) & BYTE; + frame[9] = length & BYTE; } if (code) { - frame[offset] = Math.floor(code / 256); - frame[offset+1] = code & 255; + frame[offset] = Math.floor(code / 256) & BYTE; + frame[offset+1] = code & BYTE; } buffer.copy(frame, offset + insert); if (this._masking) { mask = new Buffer([1,2,3,4].map(function() { return Math.floor(Math.random() * 256) })); mask.copy(frame, header); - for (i = 0; i < length; i++) - frame[offset + i] = frame[offset + i] ^ mask[i % 4]; + Protocol8Parser.mask(frame, mask, offset); } return frame; @@ -237,7 +248,7 @@ var instance = { }, _emitFrame: function() { - var payload = this._unmask(this._payload, this._mask), + var payload = Protocol8Parser.mask(this._payload, this._mask), opcode = this._opcode; if (opcode === this.OPCODES.continuation) { @@ -309,16 +320,6 @@ var instance = { for (var i = 0, n = bytes.length; i < n; i++) number += bytes[i] << (8 * (n - 1 - i)); return number; - }, - - _unmask: function(payload, mask) { - var unmasked = new Buffer(payload.length), b; - for (var i = 0, n = payload.length; i < n; i++) { - b = payload[i]; - if (mask.length > 0) b = b ^ mask[i % 4]; - unmasked[i] = b; - } - return unmasked; } }; diff --git a/package.json b/package.json index 5acb851..336d7ff 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { "name" : "faye-websocket" -, "description" : "Robust general-purpose WebSocket server and client" +, "description" : "Standards-compliant WebSocket server and client" , "homepage" : "http://github.com/jcoglan/faye-websocket-node" , "author" : "James Coglan (http://jcoglan.com/)" , "keywords" : ["websocket"]