Skip to content
This repository has been archived by the owner on Apr 6, 2023. It is now read-only.

Commit

Permalink
fix(nuxt): allow responding with custom headers from error.vue (#8469)
Browse files Browse the repository at this point in the history
  • Loading branch information
danielroe committed Oct 26, 2022
1 parent 1d795f0 commit 12808f1
Showing 1 changed file with 23 additions and 9 deletions.
32 changes: 23 additions & 9 deletions packages/nuxt/src/core/runtime/nitro/error.ts
@@ -1,7 +1,7 @@
import { withQuery } from 'ufo'
import type { NitroErrorHandler } from 'nitropack'
import type { H3Error } from 'h3'
import { getRequestHeaders } from 'h3'
import { H3Error, setResponseHeader, getRequestHeaders } from 'h3'
import { useNitroApp } from '#internal/nitro'
import { normalizeError, isJsonRequest } from '#internal/nitro/utils'

export default <NitroErrorHandler> async function errorhandler (error: H3Error, event) {
Expand Down Expand Up @@ -46,14 +46,15 @@ export default <NitroErrorHandler> async function errorhandler (error: H3Error,

// HTML response (via SSR)
const isErrorPage = event.req.url?.startsWith('/__nuxt_error')
let html = !isErrorPage
? await $fetch(withQuery('/__nuxt_error', errorObject), {
headers: getRequestHeaders(event) as HeadersInit
const res = !isErrorPage
? await useNitroApp().localFetch(withQuery('/__nuxt_error', errorObject), {
headers: getRequestHeaders(event) as Record<string, string>,
redirect: 'manual'
}).catch(() => null)
: null

// Fallback to static rendered error page
if (!html) {
if (!res) {
const { template } = process.dev
// @ts-ignore
? await import('@nuxt/ui-templates/templates/error-dev.mjs')
Expand All @@ -63,9 +64,22 @@ export default <NitroErrorHandler> async function errorhandler (error: H3Error,
// TODO: Support `message` in template
(errorObject as any).description = errorObject.message
}
html = template(errorObject)
event.res.setHeader('Content-Type', 'text/html;charset=UTF-8')
event.res.end(template(errorObject))
return
}

for (const [header, value] of res.headers.entries()) {
setResponseHeader(event, header, value)
}

if (res.status && res.status !== 200) {
event.res.statusCode = res.status
}

if (res.statusText) {
event.res.statusMessage = res.statusText
}

event.res.setHeader('Content-Type', 'text/html;charset=UTF-8')
event.res.end(html)
event.res.end(await res.text())
}

0 comments on commit 12808f1

Please sign in to comment.