diff --git a/lib/net_uv.js b/lib/net_uv.js index a38afd0c9d..19f2d74af2 100644 --- a/lib/net_uv.js +++ b/lib/net_uv.js @@ -100,22 +100,35 @@ function onread(buffer, offset, length) { var end = offset + length; - // Emit 'data' event. + if (buffer) { + // Emit 'data' event. - if (self._decoder) { - // Emit a string. - var string = self._decoder.write(buffer.slice(offset, end)); - if (string.length) self.emit('data', string); - } else { - // Emit a slice. Attempt to avoid slicing the buffer if no one is - // listening for 'data'. - if (self._events && self._events['data']) { - self.emit('data', buffer.slice(offset, end)); + if (self._decoder) { + // Emit a string. + var string = self._decoder.write(buffer.slice(offset, end)); + if (string.length) self.emit('data', string); + } else { + // Emit a slice. Attempt to avoid slicing the buffer if no one is + // listening for 'data'. + if (self._events && self._events['data']) { + self.emit('data', buffer.slice(offset, end)); + } } - } - // Optimization: emit the original buffer with end points - if (self.ondata) self.ondata(buffer, offset, end); + // Optimization: emit the original buffer with end points + if (self.ondata) self.ondata(buffer, offset, end); + + } else { + // EOF + self.readable = false; + + if (!self.writable) self.destroy(); + // Note: 'close' not emitted until nextTick. + + if (!self.allowHalfOpen) self.end(); + if (self._events && self._events['end']) self.emit('end'); + if (self.onend) self.onend(); + } }