diff --git a/packages/next/server/image-optimizer.ts b/packages/next/server/image-optimizer.ts index 35c10f24ed43..747d07ce5d4e 100644 --- a/packages/next/server/image-optimizer.ts +++ b/packages/next/server/image-optimizer.ts @@ -259,7 +259,13 @@ export class ImageError extends Error { constructor(statusCode: number, message: string) { super(message) - this.statusCode = statusCode + + // ensure an error status is used > 400 + if (statusCode >= 400) { + this.statusCode = statusCode + } else { + this.statusCode = 500 + } } } diff --git a/test/integration/image-optimizer/test/util.js b/test/integration/image-optimizer/test/util.js index 5c83a4fc74c5..290e108ea335 100644 --- a/test/integration/image-optimizer/test/util.js +++ b/test/integration/image-optimizer/test/util.js @@ -25,11 +25,17 @@ export async function serveSlowImage() { const server = http.createServer(async (req, res) => { const parsedUrl = new URL(req.url, 'http://localhost') const delay = Number(parsedUrl.searchParams.get('delay')) || 500 + const status = Number(parsedUrl.searchParams.get('status')) || 200 - console.log('delay image for', delay) + console.log('delaying image for', delay) await waitFor(delay) - res.statusCode = 200 + res.statusCode = status + + if (status === 308) { + res.end('invalid status') + return + } res.setHeader('content-type', 'image/png') res.end(await fs.readFile(join(__dirname, '../app/public/test.png'))) }) @@ -127,6 +133,19 @@ export function runTests(ctx) { slowImageServer.stop() }) + if (ctx.domains.includes('localhost')) { + it('should normalize invalid status codes', async () => { + const url = `http://localhost:${ + slowImageServer.port + }/slow.png?delay=${1}&status=308` + const query = { url, w: ctx.w, q: 39 } + const opts = { headers: { accept: 'image/webp' }, redirect: 'manual' } + + const res = await fetchViaHTTP(ctx.appPort, '/_next/image', query, opts) + expect(res.status).toBe(500) + }) + } + it('should return home page', async () => { const res = await fetchViaHTTP(ctx.appPort, '/', null, {}) expect(await res.text()).toMatch(/Image Optimizer Home/m)