From 331ea59ca773ce0700c73445a41189056b429e4c Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Sat, 10 Oct 2015 01:51:28 +0200 Subject: [PATCH 1/4] Improve the parser --- lib/parsers/javascript.js | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/lib/parsers/javascript.js b/lib/parsers/javascript.js index d8c19032ae..a0a594f680 100644 --- a/lib/parsers/javascript.js +++ b/lib/parsers/javascript.js @@ -2,11 +2,6 @@ var util = require('util'); -function Packet(type, size) { - this.type = type; - this.size = +size; -} - function ReplyParser(return_buffers) { this.name = exports.name; this.return_buffers = return_buffers; @@ -23,7 +18,10 @@ function IncompleteReadBuffer(message) { util.inherits(IncompleteReadBuffer, Error); ReplyParser.prototype._parseResult = function (type) { - var start, end, offset, packetHeader; + var start = 0, + end = 0, + offset = 0, + packetHeader = 0; if (type === 43 || type === 45) { // + or - // up to the delimiter @@ -62,14 +60,14 @@ ReplyParser.prototype._parseResult = function (type) { // buffer in memory offset = this._offset - 1; - packetHeader = new Packet(type, this.parseHeader()); + packetHeader = this.parseHeader(); // packets with a size of -1 are considered null - if (packetHeader.size === -1) { + if (packetHeader === -1) { return null; } - end = this._offset + packetHeader.size; + end = this._offset + packetHeader; start = this._offset; if (end > this._buffer.length) { @@ -85,13 +83,13 @@ ReplyParser.prototype._parseResult = function (type) { return this._buffer.toString(this._encoding, start, end); } else { // * offset = this._offset; - packetHeader = new Packet(type, this.parseHeader()); + packetHeader = this.parseHeader(); - if (packetHeader.size < 0) { + if (packetHeader < 0) { return null; } - if (packetHeader.size > this._bytesRemaining()) { + if (packetHeader > this._bytesRemaining()) { this._offset = offset - 1; throw new IncompleteReadBuffer('Wait for more data.'); } @@ -101,7 +99,7 @@ ReplyParser.prototype._parseResult = function (type) { offset = this._offset - 1; - for (i = 0; i < packetHeader.size; i++) { + for (i = 0; i < packetHeader; i++) { ntype = this._buffer[this._offset++]; if (this._offset > this._buffer.length) { @@ -184,7 +182,7 @@ ReplyParser.prototype.append = function (newBuffer) { ReplyParser.prototype.parseHeader = function () { var end = this._packetEndOffset(), - value = this._buffer.toString('ascii', this._offset, end - 1); + value = this._buffer.toString('ascii', this._offset, end - 1) | 0; this._offset = end + 1; From e951bfb177e65e9e03cb8dd6d1c1171c9d42b7a1 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Sat, 10 Oct 2015 01:51:37 +0200 Subject: [PATCH 2/4] Fix parser regression --- lib/parsers/javascript.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/parsers/javascript.js b/lib/parsers/javascript.js index a0a594f680..1230401e4d 100644 --- a/lib/parsers/javascript.js +++ b/lib/parsers/javascript.js @@ -81,7 +81,7 @@ ReplyParser.prototype._parseResult = function (type) { return this._buffer.slice(start, end); } return this._buffer.toString(this._encoding, start, end); - } else { // * + } else if (type === 42) { // * offset = this._offset; packetHeader = this.parseHeader(); From 0f43aa5294e711ea6e066b7377eba3a877e6c135 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Sat, 10 Oct 2015 01:59:04 +0200 Subject: [PATCH 3/4] Use msvs 2013 for appveyor to get the hiredis parser to work --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 3966d52e72..f7d70bb189 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -17,8 +17,8 @@ install: - '@ECHO Redis Started' # Get the latest stable version of Node 0.STABLE.latest - ps: Install-Product node $env:nodejs_version - # Typical npm stuff. - - npm install + # Typical npm stuff. Use msvs 2013 for the hiredis parser + - npm install --msvs_version=2013 # Post-install test scripts. test_script: From 987e4f8a7ca425a4d392b7c04c5139010748249d Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Sat, 10 Oct 2015 02:17:31 +0200 Subject: [PATCH 4/4] Add hiredis to the tests if it's present --- test/helper.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/helper.js b/test/helper.js index d007676ea6..8402b9cfc0 100644 --- a/test/helper.js +++ b/test/helper.js @@ -113,8 +113,11 @@ module.exports = { } var parsers = ['javascript']; var protocols = ['IPv4']; - if (process.platform !== 'win32') { + try { + require('hiredis'); parsers.push('hiredis'); + } catch (e) {} + if (process.platform !== 'win32') { protocols.push('IPv6', '/tmp/redis.sock'); } var options = [{