2020-11-25 20:56:18 +01:00
|
|
|
import { parse as parseUrl } from 'url'
|
|
|
|
import { IncomingMessage, ServerResponse } from 'http'
|
2022-02-11 20:56:25 +01:00
|
|
|
import { apiResolver } from '../../../../server/api-utils/node'
|
2020-11-25 20:56:18 +01:00
|
|
|
import { getUtils, vercelHeader, ServerlessHandlerCtx } from './utils'
|
2021-07-05 18:31:32 +02:00
|
|
|
import { DecodeError } from '../../../../shared/lib/utils'
|
2022-02-11 20:56:25 +01:00
|
|
|
import {
|
|
|
|
NodeNextResponse,
|
|
|
|
NodeNextRequest,
|
|
|
|
} from '../../../../server/base-http/node'
|
2020-11-25 20:56:18 +01:00
|
|
|
|
|
|
|
export function getApiHandler(ctx: ServerlessHandlerCtx) {
|
2021-04-22 21:03:13 +02:00
|
|
|
const { pageModule, encodedPreviewProps, pageIsDynamic } = ctx
|
2020-11-25 20:56:18 +01:00
|
|
|
const {
|
|
|
|
handleRewrites,
|
|
|
|
handleBasePath,
|
|
|
|
dynamicRouteMatcher,
|
|
|
|
normalizeDynamicRouteParams,
|
|
|
|
} = getUtils(ctx)
|
|
|
|
|
2022-01-14 22:01:35 +01:00
|
|
|
return async (
|
|
|
|
rawReq: NodeNextRequest | IncomingMessage,
|
|
|
|
rawRes: NodeNextResponse | ServerResponse
|
|
|
|
) => {
|
|
|
|
const req =
|
|
|
|
rawReq instanceof IncomingMessage ? new NodeNextRequest(rawReq) : rawReq
|
|
|
|
const res =
|
|
|
|
rawRes instanceof ServerResponse ? new NodeNextResponse(rawRes) : rawRes
|
|
|
|
|
2020-11-25 20:56:18 +01:00
|
|
|
try {
|
|
|
|
// We need to trust the dynamic route params from the proxy
|
|
|
|
// to ensure we are using the correct values
|
|
|
|
const trustQuery = req.headers[vercelHeader]
|
2021-03-24 17:50:16 +01:00
|
|
|
const parsedUrl = handleRewrites(req, parseUrl(req.url!, true))
|
2020-11-25 20:56:18 +01:00
|
|
|
|
|
|
|
if (parsedUrl.query.nextInternalLocale) {
|
|
|
|
delete parsedUrl.query.nextInternalLocale
|
|
|
|
}
|
|
|
|
handleBasePath(req, parsedUrl)
|
|
|
|
|
|
|
|
let params = {}
|
|
|
|
|
|
|
|
if (pageIsDynamic) {
|
|
|
|
const result = normalizeDynamicRouteParams(
|
|
|
|
trustQuery
|
|
|
|
? parsedUrl.query
|
|
|
|
: (dynamicRouteMatcher!(parsedUrl.pathname) as Record<
|
|
|
|
string,
|
|
|
|
string | string[]
|
|
|
|
>)
|
|
|
|
)
|
|
|
|
|
|
|
|
params = result.params
|
|
|
|
}
|
|
|
|
|
|
|
|
await apiResolver(
|
2022-01-14 22:01:35 +01:00
|
|
|
req.originalRequest,
|
|
|
|
res.originalResponse,
|
2020-11-25 20:56:18 +01:00
|
|
|
Object.assign({}, parsedUrl.query, params),
|
|
|
|
await pageModule,
|
|
|
|
encodedPreviewProps,
|
2021-04-22 21:03:13 +02:00
|
|
|
true
|
2020-11-25 20:56:18 +01:00
|
|
|
)
|
|
|
|
} catch (err) {
|
|
|
|
console.error(err)
|
|
|
|
|
2021-07-05 18:31:32 +02:00
|
|
|
if (err instanceof DecodeError) {
|
2020-11-25 20:56:18 +01:00
|
|
|
res.statusCode = 400
|
2022-01-14 22:01:35 +01:00
|
|
|
res.body('Bad Request').send()
|
2020-11-25 20:56:18 +01:00
|
|
|
} else {
|
|
|
|
// Throw the error to crash the serverless function
|
|
|
|
throw err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|