diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 06797c4ea1..51201e82fe 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -153,6 +153,13 @@ Readable.prototype.read = function(n) { if (!chunk || !chunk.length) { // eof state.ended = true; + if (state.decoder) { + chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += chunk.length; + } + } // if we've ended and we have some data left, then emit // 'readable' now to make sure it gets picked up. if (!sync) { @@ -395,11 +402,26 @@ Readable.prototype.wrap = function(stream) { stream.on('end', function() { state.ended = true; - if (state.length === 0) + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += chunk.length; + } + } + + if (state.length > 0) + this.emit('readable'); + else endReadable(this); }.bind(this)); stream.on('data', function(chunk) { + if (state.decoder) + chunk = state.decoder.write(chunk); + if (!chunk || !chunk.length) + return; + state.buffer.push(chunk); state.length += chunk.length; this.emit('readable');