Skip to content

Commit acddd02

Browse files
committed
Merge pull request #886 from NodeRedis/fix-parser
Fix js parser regression. Fixes #881 Fixes #880 Fixes #875
2 parents 7922d4e + 987e4f8 commit acddd02

File tree

3 files changed

+19
-18
lines changed

3 files changed

+19
-18
lines changed

appveyor.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ install:
1717
- '@ECHO Redis Started'
1818
# Get the latest stable version of Node 0.STABLE.latest
1919
- ps: Install-Product node $env:nodejs_version
20-
# Typical npm stuff.
21-
- npm install
20+
# Typical npm stuff. Use msvs 2013 for the hiredis parser
21+
- npm install --msvs_version=2013
2222

2323
# Post-install test scripts.
2424
test_script:

lib/parsers/javascript.js

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@
22

33
var util = require('util');
44

5-
function Packet(type, size) {
6-
this.type = type;
7-
this.size = +size;
8-
}
9-
105
function ReplyParser(return_buffers) {
116
this.name = exports.name;
127
this.return_buffers = return_buffers;
@@ -23,7 +18,10 @@ function IncompleteReadBuffer(message) {
2318
util.inherits(IncompleteReadBuffer, Error);
2419

2520
ReplyParser.prototype._parseResult = function (type) {
26-
var start, end, offset, packetHeader;
21+
var start = 0,
22+
end = 0,
23+
offset = 0,
24+
packetHeader = 0;
2725

2826
if (type === 43 || type === 45) { // + or -
2927
// up to the delimiter
@@ -62,14 +60,14 @@ ReplyParser.prototype._parseResult = function (type) {
6260
// buffer in memory
6361
offset = this._offset - 1;
6462

65-
packetHeader = new Packet(type, this.parseHeader());
63+
packetHeader = this.parseHeader();
6664

6765
// packets with a size of -1 are considered null
68-
if (packetHeader.size === -1) {
66+
if (packetHeader === -1) {
6967
return null;
7068
}
7169

72-
end = this._offset + packetHeader.size;
70+
end = this._offset + packetHeader;
7371
start = this._offset;
7472

7573
if (end > this._buffer.length) {
@@ -83,15 +81,15 @@ ReplyParser.prototype._parseResult = function (type) {
8381
return this._buffer.slice(start, end);
8482
}
8583
return this._buffer.toString(this._encoding, start, end);
86-
} else { // *
84+
} else if (type === 42) { // *
8785
offset = this._offset;
88-
packetHeader = new Packet(type, this.parseHeader());
86+
packetHeader = this.parseHeader();
8987

90-
if (packetHeader.size < 0) {
88+
if (packetHeader < 0) {
9189
return null;
9290
}
9391

94-
if (packetHeader.size > this._bytesRemaining()) {
92+
if (packetHeader > this._bytesRemaining()) {
9593
this._offset = offset - 1;
9694
throw new IncompleteReadBuffer('Wait for more data.');
9795
}
@@ -101,7 +99,7 @@ ReplyParser.prototype._parseResult = function (type) {
10199

102100
offset = this._offset - 1;
103101

104-
for (i = 0; i < packetHeader.size; i++) {
102+
for (i = 0; i < packetHeader; i++) {
105103
ntype = this._buffer[this._offset++];
106104

107105
if (this._offset > this._buffer.length) {
@@ -184,7 +182,7 @@ ReplyParser.prototype.append = function (newBuffer) {
184182

185183
ReplyParser.prototype.parseHeader = function () {
186184
var end = this._packetEndOffset(),
187-
value = this._buffer.toString('ascii', this._offset, end - 1);
185+
value = this._buffer.toString('ascii', this._offset, end - 1) | 0;
188186

189187
this._offset = end + 1;
190188

test/helper.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,11 @@ module.exports = {
113113
}
114114
var parsers = ['javascript'];
115115
var protocols = ['IPv4'];
116-
if (process.platform !== 'win32') {
116+
try {
117+
require('hiredis');
117118
parsers.push('hiredis');
119+
} catch (e) {}
120+
if (process.platform !== 'win32') {
118121
protocols.push('IPv6', '/tmp/redis.sock');
119122
}
120123
var options = [{

0 commit comments

Comments
 (0)