|
import { ENDPOINT_METHODS, PAGE_METHODS } from '../../constants.js'; |
|
import { negotiate } from '../../utils/http.js'; |
|
import { Redirect } from '../control.js'; |
|
import { method_not_allowed } from './utils.js'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export async function render_endpoint(event, mod, state) { |
|
const method = (event.request.method); |
|
|
|
let handler = mod[method] || mod.fallback; |
|
|
|
if (method === 'HEAD' && mod.GET && !mod.HEAD) { |
|
handler = mod.GET; |
|
} |
|
|
|
if (!handler) { |
|
return method_not_allowed(mod, method); |
|
} |
|
|
|
const prerender = mod.prerender ?? state.prerender_default; |
|
|
|
if (prerender && (mod.POST || mod.PATCH || mod.PUT || mod.DELETE)) { |
|
throw new Error('Cannot prerender endpoints that have mutative methods'); |
|
} |
|
|
|
if (state.prerendering && !prerender) { |
|
if (state.depth > 0) { |
|
|
|
throw new Error(`${event.route.id} is not prerenderable`); |
|
} else { |
|
|
|
|
|
return new Response(undefined, { status: 204 }); |
|
} |
|
} |
|
|
|
try { |
|
let response = await handler( |
|
(event) |
|
); |
|
|
|
if (!(response instanceof Response)) { |
|
throw new Error( |
|
`Invalid response from route ${event.url.pathname}: handler should return a Response object` |
|
); |
|
} |
|
|
|
if (state.prerendering) { |
|
|
|
|
|
response = new Response(response.body, { |
|
status: response.status, |
|
statusText: response.statusText, |
|
headers: new Headers(response.headers) |
|
}); |
|
response.headers.set('x-sveltekit-prerender', String(prerender)); |
|
} |
|
|
|
return response; |
|
} catch (e) { |
|
if (e instanceof Redirect) { |
|
return new Response(undefined, { |
|
status: e.status, |
|
headers: { location: e.location } |
|
}); |
|
} |
|
|
|
throw e; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
export function is_endpoint_request(event) { |
|
const { method, headers } = event.request; |
|
|
|
|
|
if (ENDPOINT_METHODS.includes(method) && !PAGE_METHODS.includes(method)) { |
|
return true; |
|
} |
|
|
|
|
|
if (method === 'POST' && headers.get('x-sveltekit-action') === 'true') return false; |
|
|
|
|
|
const accept = event.request.headers.get('accept') ?? '*/*'; |
|
return negotiate(accept, ['*', 'text/html']) !== 'text/html'; |
|
} |
|
|