diff --git a/lib/api/apiUtils/object/prepareStream.js b/lib/api/apiUtils/object/prepareStream.js index 493e25f185..be3f6c69ca 100644 --- a/lib/api/apiUtils/object/prepareStream.js +++ b/lib/api/apiUtils/object/prepareStream.js @@ -31,13 +31,14 @@ function prepareStream(stream, streamingV4Params, log, errCb) { return stream; } -function stripTrailingChecksumStream(stream, log) { +function stripTrailingChecksumStream(stream, log, errCb) { // don't do anything if we are not in the correct integrity check mode if (stream.headers['x-amz-content-sha256'] !== 'STREAMING-UNSIGNED-PAYLOAD-TRAILER') { return stream; } const trailingChecksumTransform = new TrailingChecksumTransform(log); + trailingChecksumTransform.on('error', errCb); stream.pipe(trailingChecksumTransform); trailingChecksumTransform.headers = stream.headers; return trailingChecksumTransform; diff --git a/tests/unit/auth/TrailingChecksumTransform.js b/tests/unit/auth/TrailingChecksumTransform.js index 9cae54e659..dd88b3719b 100644 --- a/tests/unit/auth/TrailingChecksumTransform.js +++ b/tests/unit/auth/TrailingChecksumTransform.js @@ -4,6 +4,7 @@ const async = require('async'); const { Readable } = require('stream'); const TrailingChecksumTransform = require('../../../lib/auth/streamingV4/trailingChecksumTransform'); +const { stripTrailingChecksumStream } = require('../../../lib/api/apiUtils/object/prepareStream'); const { DummyRequestLogger } = require('../helpers'); const log = new DummyRequestLogger(); @@ -170,6 +171,28 @@ describe('TrailingChecksumTransform class', () => { chunkedReader.pipe(trailingChecksumTransform); }); + it('should propagate _flush error via errCb when stream closes without chunked encoding', done => { + const incompleteData = '10\r\n01234\r6789abcd\r\n\r\n'; + const source = new ChunkedReader([Buffer.from(incompleteData)]); + source.headers = { 'x-amz-content-sha256': 'STREAMING-UNSIGNED-PAYLOAD-TRAILER' }; + const stream = stripTrailingChecksumStream(source, log, err => { + assert.deepStrictEqual(err, errors.InvalidArgument); + done(); + }); + stream.resume(); + }); + + it('should propagate _transform error via errCb for invalid chunk size', done => { + const badData = '500000000000\r\n'; + const source = new ChunkedReader([Buffer.from(badData)]); + source.headers = { 'x-amz-content-sha256': 'STREAMING-UNSIGNED-PAYLOAD-TRAILER' }; + const stream = stripTrailingChecksumStream(source, log, err => { + assert.deepStrictEqual(err, errors.InvalidArgument); + done(); + }); + stream.resume(); + }); + it('should return early if supplied with an out of specification chunk size', done => { const trailingChecksumTransform = new TrailingChecksumTransform(log); const chunks = [