Browse Source

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
v0.7.4-release
Russell Haering 15 years ago
committed by Ryan Dahl
parent
commit
37b6e10684
  1. 5
      doc/api.markdown
  2. 5
      lib/sys.js
  3. 52
      test/simple/test-pump-file2tcp-noexist.js

5
doc/api.markdown

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

5
lib/sys.js

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

52
test/simple/test-pump-file2tcp-noexist.js

@ -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");
});
Loading…
Cancel
Save