Pass an error to the sys.pump callback if one occurs

- Add test case for pumping from unreadable stream.
- Document the sys.pump error handling behavior
This commit is contained in:
Russell Haering 2010-08-23 13:12:57 -07:00 коммит произвёл Ryan Dahl
Родитель 57642e2349
Коммит 37b6e10684
3 изменённых файлов: 60 добавлений и 2 удалений

Просмотреть файл

@ -860,8 +860,9 @@ Experimental
Read the data from `readableStream` and send it to the `writableStream`.
When `writeableStream.write(data)` returns `false` `readableStream` will be
paused until the `drain` event occurs on the `writableStream`. `callback` is
called when `writableStream` is closed.
paused until the `drain` event occurs on the `writableStream`. `callback` gets
an error as its only argument and is called when `writableStream` is closed or
when an error occurs.
## Timers

Просмотреть файл

@ -309,6 +309,11 @@ exports.pump = function (readStream, writeStream, callback) {
readStream.addListener("close", function () {
if (callback) callback();
});
readStream.addListener("error", function(err) {
writeStream.end();
if (callback) callback(err);
});
};
/**

Просмотреть файл

@ -0,0 +1,52 @@
common = require("../common");
assert = common.assert
net = require("net");
fs = require("fs");
sys = require("sys");
path = require("path");
fn = path.join(common.fixturesDir, 'does_not_exist.txt');
var got_error = false;
var conn_closed = false;
server = net.createServer(function (stream) {
common.error('pump!');
sys.pump(fs.createReadStream(fn), stream, function (err) {
common.error("sys.pump's callback fired");
if (err) {
got_error = true;
} else {
common.debug("sys.pump's callback fired with no error");
common.debug("this shouldn't happen as the file doesn't exist...");
assert.equal(true, false);
}
server.close();
});
});
server.listen(common.PORT, function () {
conn = net.createConnection(common.PORT);
conn.setEncoding('utf8');
conn.addListener("data", function (chunk) {
common.error('recv data! nchars = ' + chunk.length);
buffer += chunk;
});
conn.addListener("end", function () {
conn.end();
});
conn.addListener("close", function () {
common.error('client connection close');
conn_closed = true;
});
});
var buffer = '';
count = 0;
process.addListener('exit', function () {
assert.equal(true, got_error);
assert.equal(true, conn_closed);
console.log("exiting");
});