Browse Source

stream: Never call decoder.end() multiple times

Updated version that does what it says without assigning state.decoder.
v0.10.1-release
Gil Pedersen 12 years ago
committed by isaacs
parent
commit
e8f80bf479
  1. 8
      lib/_stream_readable.js
  2. 73
      test/simple/test-stream2-set-encoding.js

8
lib/_stream_readable.js

@ -342,14 +342,14 @@ function chunkInvalid(state, chunk) {
function onEofChunk(stream, state) { function onEofChunk(stream, state) {
state.ended = true; if (state.decoder && !state.ended) {
if (state.decoder) {
var chunk = state.decoder.end(); var chunk = state.decoder.end();
if (chunk && chunk.length) { if (chunk && chunk.length) {
state.buffer.push(chunk); state.buffer.push(chunk);
state.length += state.objectMode ? 1 : chunk.length; state.length += state.objectMode ? 1 : chunk.length;
} }
} }
state.ended = true;
// if we've ended and we have some data left, then emit // if we've ended and we have some data left, then emit
// 'readable' now to make sure it gets picked up. // 'readable' now to make sure it gets picked up.
@ -733,12 +733,12 @@ Readable.prototype.wrap = function(stream) {
var self = this; var self = this;
stream.on('end', function() { stream.on('end', function() {
state.ended = true; if (state.decoder && !state.ended) {
if (state.decoder) {
var chunk = state.decoder.end(); var chunk = state.decoder.end();
if (chunk && chunk.length) if (chunk && chunk.length)
self.push(chunk); self.push(chunk);
} }
state.ended = true;
self.push(null); self.push(null);
}); });

73
test/simple/test-stream2-set-encoding.js

@ -74,11 +74,15 @@ TestReader.prototype._read = function(n) {
setTimeout(function() { setTimeout(function() {
if (this.pos >= this.len) { if (this.pos >= this.len) {
// double push(null) to test eos handling
this.push(null);
return this.push(null); return this.push(null);
} }
n = Math.min(n, this.len - this.pos); n = Math.min(n, this.len - this.pos);
if (n <= 0) { if (n <= 0) {
// double push(null) to test eos handling
this.push(null);
return this.push(null); return this.push(null);
} }
@ -204,6 +208,41 @@ test('setEncoding hex with read(13)', function(t) {
tr.emit('readable'); tr.emit('readable');
}); });
test('setEncoding base64', function(t) {
var tr = new TestReader(100);
tr.setEncoding('base64');
var out = [];
var expect =
[ 'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYQ==' ];
tr.on('readable', function flow() {
var chunk;
while (null !== (chunk = tr.read(10)))
out.push(chunk);
});
tr.on('end', function() {
t.same(out, expect);
t.end();
});
// just kick it off.
tr.emit('readable');
});
test('encoding: utf8', function(t) { test('encoding: utf8', function(t) {
var tr = new TestReader(100, { encoding: 'utf8' }); var tr = new TestReader(100, { encoding: 'utf8' });
var out = []; var out = [];
@ -310,3 +349,37 @@ test('encoding: hex with read(13)', function(t) {
// just kick it off. // just kick it off.
tr.emit('readable'); tr.emit('readable');
}); });
test('encoding: base64', function(t) {
var tr = new TestReader(100, { encoding: 'base64' });
var out = [];
var expect =
[ 'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYWFhYWFh',
'YWFhYWFhYW',
'FhYQ==' ];
tr.on('readable', function flow() {
var chunk;
while (null !== (chunk = tr.read(10)))
out.push(chunk);
});
tr.on('end', function() {
t.same(out, expect);
t.end();
});
// just kick it off.
tr.emit('readable');
});

Loading…
Cancel
Save