From 1666a33d23c779bf5cb6b9fcd4d0cace1ada609b Mon Sep 17 00:00:00 2001 From: six Date: Wed, 14 Aug 2024 06:00:43 -0400 Subject: [PATCH] fix: handle relative and invalid URLs in redirects when passing URL to loadImage() (#866) * fix: handle invalid urls in load-image.js (#865) * fix: handle relative urls in redirects (#865) --------- Co-authored-by: LongYinan --- load-image.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/load-image.js b/load-image.js index 2ee6b0e0..187d8cb3 100644 --- a/load-image.js +++ b/load-image.js @@ -61,14 +61,18 @@ function makeRequest(url, resolve, reject, redirectCount, requestOptions) { lib .get(url.toString(), requestOptions || {}, (res) => { - const shouldRedirect = REDIRECT_STATUSES.has(res.statusCode) && typeof res.headers.location === 'string' - if (shouldRedirect && redirectCount > 0) - return makeRequest(new URL(res.headers.location), resolve, reject, redirectCount - 1, requestOptions) - if (typeof res.statusCode === 'number' && (res.statusCode < 200 || res.statusCode >= 300)) { - return reject(new Error(`remote source rejected with status code ${res.statusCode}`)) + try { + const shouldRedirect = REDIRECT_STATUSES.has(res.statusCode) && typeof res.headers.location === 'string' + if (shouldRedirect && redirectCount > 0) + return makeRequest(new URL(res.headers.location, url.origin), resolve, reject, redirectCount - 1, requestOptions) + if (typeof res.statusCode === 'number' && (res.statusCode < 200 || res.statusCode >= 300)) { + return reject(new Error(`remote source rejected with status code ${res.statusCode}`)) + } + + consumeStream(res).then(resolve, reject) + } catch (err) { + reject(err) } - - consumeStream(res).then(resolve, reject) }) .on('error', reject) }