From 734c23ccaa4b059cd638d26795a16b2497a234d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Fri, 20 Jan 2023 10:46:03 +0000 Subject: [PATCH] fix: gracefully handle errors when setting headers (#5411) * fix: gracefully handle errors when setting headers * feat: show error page --- src/lib/functions/server.mjs | 2 +- src/lib/functions/synchronous.mjs | 35 ++++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/lib/functions/server.mjs b/src/lib/functions/server.mjs index 49d497f9717..c630a83a170 100644 --- a/src/lib/functions/server.mjs +++ b/src/lib/functions/server.mjs @@ -168,7 +168,7 @@ export const createHandler = function (options) { return } - handleSynchronousFunction(error, result, request, response) + handleSynchronousFunction({ error, functionName: func.name, result, request, response }) } } } diff --git a/src/lib/functions/synchronous.mjs b/src/lib/functions/synchronous.mjs index 479dd66611a..1543442621c 100644 --- a/src/lib/functions/synchronous.mjs +++ b/src/lib/functions/synchronous.mjs @@ -1,7 +1,7 @@ // @ts-check import { Buffer } from 'buffer' -import { NETLIFYDEVERR } from '../../utils/command-helpers.mjs' +import { chalk, log, NETLIFYDEVERR } from '../../utils/command-helpers.mjs' import renderErrorTemplate from '../render-error-template.mjs' import { detectAwsSdkError } from './utils.mjs' @@ -16,20 +16,35 @@ const addHeaders = (headers, response) => { }) } -export const handleSynchronousFunction = function (err, result, request, response) { - if (err) { - return handleErr(err, request, response) +export const handleSynchronousFunction = function ({ + error: invocationError, + functionName, + request, + response, + result, +}) { + if (invocationError) { + return handleErr(invocationError, request, response) } const { error } = validateLambdaResponse(result) if (error) { - console.log(`${NETLIFYDEVERR} ${error}`) + log(`${NETLIFYDEVERR} ${error}`) return handleErr(error, request, response) } response.statusCode = result.statusCode - addHeaders(result.headers, response) - addHeaders(result.multiValueHeaders, response) + + try { + addHeaders(result.headers, response) + addHeaders(result.multiValueHeaders, response) + } catch (headersError) { + formatError(headersError) + + log(`${NETLIFYDEVERR} Failed to set header in function ${chalk.yellow(functionName)}: ${headersError.message}`) + + return handleErr(headersError, request, response) + } if (result.body) { response.write(result.isBase64Encoded ? Buffer.from(result.body, 'base64') : result.body) @@ -37,6 +52,12 @@ export const handleSynchronousFunction = function (err, result, request, respons response.end() } +const formatError = (err) => { + err.errorType = err.code + err.errorMessage = err.message + err.stackTrace = err.trace +} + const formatLambdaLocalError = (err, acceptsHtml) => acceptsHtml ? JSON.stringify({