0
0
mirror of https://github.com/nodejs/node.git synced 2024-12-01 16:10:02 +01:00

stream: Never call decoder.end() multiple times

Updated version that does what it says without assigning state.decoder.
This commit is contained in:
Gil Pedersen 2013-03-14 14:01:14 +01:00 committed by isaacs
parent 1f53cfdeae
commit e8f80bf479
2 changed files with 77 additions and 4 deletions

View File

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

View File

@ -74,11 +74,15 @@ TestReader.prototype._read = function(n) {
setTimeout(function() {
if (this.pos >= this.len) {
// double push(null) to test eos handling
this.push(null);
return this.push(null);
}
n = Math.min(n, this.len - this.pos);
if (n <= 0) {
// double push(null) to test eos handling
this.push(null);
return this.push(null);
}
@ -204,6 +208,41 @@ test('setEncoding hex with read(13)', function(t) {
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) {
var tr = new TestReader(100, { encoding: 'utf8' });
var out = [];
@ -310,3 +349,37 @@ test('encoding: hex with read(13)', function(t) {
// just kick it off.
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');
});