Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Pass an error to the sys.pump callback if one occurs
Browse files Browse the repository at this point in the history
- Add test case for pumping from unreadable stream.
- Document the sys.pump error handling behavior
  • Loading branch information
russellhaering authored and ry committed Sep 17, 2010
1 parent 8dcd6dc commit 09a41a7
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 2 deletions.
5 changes: 3 additions & 2 deletions doc/api.markdown
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions lib/sys.js
Expand Up @@ -354,6 +354,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);
});
};

/**
Expand Down
52 changes: 52 additions & 0 deletions 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");
});

0 comments on commit 09a41a7

Please sign in to comment.