diff --git a/packages/next/next-server/server/image-optimizer.ts b/packages/next/next-server/server/image-optimizer.ts index 69bb10f261ca873721f0d98c6fe2e84a814c20f1..eef496c15f6a4629a60cb87b67162b5fb783e158 100644 --- a/packages/next/next-server/server/image-optimizer.ts +++ b/packages/next/next-server/server/image-optimizer.ts @@ -230,6 +230,13 @@ export async function imageOptimizer( sendResponse(req, res, upstreamType, upstreamBuffer) return { finished: true } } + + // If upstream type is not a valid image type, return 400 error. + if (!upstreamType.startsWith('image/')) { + res.statusCode = 400 + res.end("The requested resource isn't a valid image.") + return { finished: true } + } } let contentType: string diff --git a/test/integration/image-optimizer/public/text.txt b/test/integration/image-optimizer/public/text.txt new file mode 100644 index 0000000000000000000000000000000000000000..32f95c0d1244a78b2be1bab8de17906fabb2c4a8 --- /dev/null +++ b/test/integration/image-optimizer/public/text.txt @@ -0,0 +1 @@ +hi \ No newline at end of file diff --git a/test/integration/image-optimizer/test/index.test.js b/test/integration/image-optimizer/test/index.test.js index 41cb945cb3767e7b9038f1bf215e2957e9887972..f5bf0e2847b9663accec01c08da7b2bf636f6a8b 100644 --- a/test/integration/image-optimizer/test/index.test.js +++ b/test/integration/image-optimizer/test/index.test.js @@ -481,6 +481,14 @@ function runTests({ w, isDev, domains }) { expect(res.headers.get('etag')).toBeTruthy() await expectWidth(res, 400) }) + + it("should error if the resource isn't a valid image", async () => { + const query = { url: '/test.txt', w, q: 80 } + const opts = { headers: { accept: 'image/webp' } } + const res = await fetchViaHTTP(appPort, '/_next/image', query, opts) + expect(res.status).toBe(400) + expect(await res.text()).toBe("The requested resource isn't a valid image.") + }) } describe('Image Optimizer', () => {