diff --git a/doc/api.markdown b/doc/api.markdown index 2434c3fd6a..c9e2688ce5 100644 --- a/doc/api.markdown +++ b/doc/api.markdown @@ -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 diff --git a/lib/sys.js b/lib/sys.js index 1ea68a70cd..8480facb7e 100644 --- a/lib/sys.js +++ b/lib/sys.js @@ -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); + }); }; /** diff --git a/test/simple/test-pump-file2tcp-noexist.js b/test/simple/test-pump-file2tcp-noexist.js new file mode 100644 index 0000000000..618b0a8944 --- /dev/null +++ b/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"); +});