From e3ecc5044a5c7edda68ed78ffc3ccd054a46bc5a Mon Sep 17 00:00:00 2001 From: shakilurrehman21 Date: Fri, 11 Sep 2026 20:47:28 +0530 Subject: [PATCH] fix(image): return 502 when upstream request fails --- packages/next/src/server/image-optimizer.ts | 5 ++++- .../fetch-external-image.test.ts | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/next/src/server/image-optimizer.ts b/packages/next/src/server/image-optimizer.ts index 6ecce812767c..2d428f6d93b4 100644 --- a/packages/next/src/server/image-optimizer.ts +++ b/packages/next/src/server/image-optimizer.ts @@ -561,7 +561,10 @@ export async function fetchExternalImage( '"url" parameter is valid but upstream response timed out' ) } - throw err + throw new ImageError( + 502, + '"url" parameter is valid but upstream request failed' + ) } const locationHeader = res.headers.get('Location') diff --git a/test/unit/image-optimizer/fetch-external-image.test.ts b/test/unit/image-optimizer/fetch-external-image.test.ts index 46220b538c2c..f69afadce5b2 100644 --- a/test/unit/image-optimizer/fetch-external-image.test.ts +++ b/test/unit/image-optimizer/fetch-external-image.test.ts @@ -233,4 +233,21 @@ describe('fetchExternalImage', () => { expect(result.buffer.length).toBe(maximumResponseBody) }) }) + describe('upstream fetch errors', () => { + it('should throw a 502 ImageError when the upstream fetch fails', async () => { + global.fetch = jest.fn().mockRejectedValue(new Error('fetch failed')) + + const error = await fetchExternalImage( + 'https://example.com/image.jpg', + false, + 50_000_000 + ).catch((e) => e) + + expect(error).toBeInstanceOf(ImageError) + expect((error as ImageError).statusCode).toBe(502) + expect((error as ImageError).message).toBe( + '"url" parameter is valid but upstream request failed' + ) + }) + }) })