From 4cb4d450be9c66408344b7176b9cb600d8a044b1 Mon Sep 17 00:00:00 2001 From: Simon Detheridge Date: Mon, 30 Mar 2020 15:03:09 +0100 Subject: [PATCH 1/4] Call end() when handing ERR_STREAM_PREMATURE_CLOSE --- services/filestore/app/js/FileController.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/filestore/app/js/FileController.js b/services/filestore/app/js/FileController.js index 0e663f9421..e39afd67bb 100644 --- a/services/filestore/app/js/FileController.js +++ b/services/filestore/app/js/FileController.js @@ -61,7 +61,9 @@ function getFile(req, res, next) { } pipeline(fileStream, res, err => { - if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + if (err && err.code === 'ERR_STREAM_PREMATURE_CLOSE') { + res.end() + } else if (err) { next( new Errors.ReadError({ message: 'error transferring stream', From 87b8f8e194130815382a2a4af994dad760cf569f Mon Sep 17 00:00:00 2001 From: Simon Detheridge Date: Mon, 30 Mar 2020 17:13:40 +0100 Subject: [PATCH 2/4] Destroy file-download stream on error --- services/filestore/app/js/FileController.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/services/filestore/app/js/FileController.js b/services/filestore/app/js/FileController.js index e39afd67bb..748026f76c 100644 --- a/services/filestore/app/js/FileController.js +++ b/services/filestore/app/js/FileController.js @@ -61,15 +61,18 @@ function getFile(req, res, next) { } pipeline(fileStream, res, err => { - if (err && err.code === 'ERR_STREAM_PREMATURE_CLOSE') { - res.end() - } else if (err) { - next( - new Errors.ReadError({ - message: 'error transferring stream', - info: { bucket, key, format, style } - }).withCause(err) - ) + if (err) { + fileStream.destroy() + if (err.code === 'ERR_STREAM_PREMATURE_CLOSE') { + res.end() + } else { + next( + new Errors.ReadError({ + message: 'error transferring stream', + info: { bucket, key, format, style } + }).withCause(err) + ) + } } }) }) From 5fadafaf961732012052b856c077b50f10c3636a Mon Sep 17 00:00:00 2001 From: Simon Detheridge Date: Mon, 30 Mar 2020 17:14:46 +0100 Subject: [PATCH 3/4] Destroy streams handled by getReadyPipeline on error --- services/filestore/app/js/PersistorHelper.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/filestore/app/js/PersistorHelper.js b/services/filestore/app/js/PersistorHelper.js index f2d0013915..826412b302 100644 --- a/services/filestore/app/js/PersistorHelper.js +++ b/services/filestore/app/js/PersistorHelper.js @@ -112,6 +112,11 @@ function getReadyPipeline(...streams) { } resolve(lastStream) } + if (err) { + for (const stream of streams) { + stream.destroy() + } + } } pipeline(...streams).catch(handler) From f440cec8ec15f9df9513a2ddb1cffd9dd1138e0b Mon Sep 17 00:00:00 2001 From: Simon Detheridge Date: Tue, 31 Mar 2020 11:07:31 +0100 Subject: [PATCH 4/4] Check if streams are already destroyed before destroying --- services/filestore/app/js/FileController.js | 22 ++++++++++---------- services/filestore/app/js/PersistorHelper.js | 4 +++- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/services/filestore/app/js/FileController.js b/services/filestore/app/js/FileController.js index 748026f76c..72f68047ab 100644 --- a/services/filestore/app/js/FileController.js +++ b/services/filestore/app/js/FileController.js @@ -61,18 +61,18 @@ function getFile(req, res, next) { } pipeline(fileStream, res, err => { - if (err) { + if (!fileStream.destroyed) { fileStream.destroy() - if (err.code === 'ERR_STREAM_PREMATURE_CLOSE') { - res.end() - } else { - next( - new Errors.ReadError({ - message: 'error transferring stream', - info: { bucket, key, format, style } - }).withCause(err) - ) - } + } + if (err && err.code === 'ERR_STREAM_PREMATURE_CLOSE') { + res.end() + } else if (err) { + next( + new Errors.ReadError({ + message: 'error transferring stream', + info: { bucket, key, format, style } + }).withCause(err) + ) } }) }) diff --git a/services/filestore/app/js/PersistorHelper.js b/services/filestore/app/js/PersistorHelper.js index 826412b302..99ac26aece 100644 --- a/services/filestore/app/js/PersistorHelper.js +++ b/services/filestore/app/js/PersistorHelper.js @@ -114,7 +114,9 @@ function getReadyPipeline(...streams) { } if (err) { for (const stream of streams) { - stream.destroy() + if (!stream.destroyed) { + stream.destroy() + } } } }