From 4a711f85113c686dd22ad1f56012ae5917340b93 Mon Sep 17 00:00:00 2001 From: Chang-Hung Liang Date: Fri, 20 Dec 2024 17:29:06 +0800 Subject: [PATCH] fix(core): native fetch patch should not reuse logger instance --- packages/core/src/tools/fetch-logger.js | 35 ++++++++++++++---------- packages/core/test/tools/fetch-logger.js | 23 ++++++++++++++++ 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/packages/core/src/tools/fetch-logger.js b/packages/core/src/tools/fetch-logger.js index 693adec20..c6b79e5b1 100644 --- a/packages/core/src/tools/fetch-logger.js +++ b/packages/core/src/tools/fetch-logger.js @@ -73,6 +73,9 @@ const stringifyResponseContent = async (response) => { // global.fetch = wrapFetchWithLogger(global.fetch, logger); const wrapFetchWithLogger = (fetchFunc, logger) => { if (fetchFunc.patchedByZapier) { + // Important not to reuse logger between calls, because we always destroy + // the logger at the end of a Lambda call. + fetchFunc.zapierLogger = logger; return fetchFunc; } @@ -82,25 +85,29 @@ const wrapFetchWithLogger = (fetchFunc, logger) => { if (requestInfo && !isZapierUserAgent(requestInfo.headers)) { const responseContentType = response.headers.get('content-type'); - logger(`${response.status} ${requestInfo.method} ${requestInfo.url}`, { - log_type: 'http', - request_type: 'patched-devplatform-outbound', - request_url: requestInfo.url, - request_method: requestInfo.method, - request_headers: requestInfo.headers, - request_data: requestInfo.data, - request_via_client: false, - response_status_code: response.status, - response_headers: Object.fromEntries(response.headers.entries()), - response_content: shouldIncludeResponseContent(responseContentType) - ? await stringifyResponseContent(response) - : '', - }); + newFetch.zapierLogger( + `${response.status} ${requestInfo.method} ${requestInfo.url}`, + { + log_type: 'http', + request_type: 'patched-devplatform-outbound', + request_url: requestInfo.url, + request_method: requestInfo.method, + request_headers: requestInfo.headers, + request_data: requestInfo.data, + request_via_client: false, + response_status_code: response.status, + response_headers: Object.fromEntries(response.headers.entries()), + response_content: shouldIncludeResponseContent(responseContentType) + ? await stringifyResponseContent(response) + : '', + }, + ); } return response; }; newFetch.patchedByZapier = true; + newFetch.zapierLogger = logger; return newFetch; }; diff --git a/packages/core/test/tools/fetch-logger.js b/packages/core/test/tools/fetch-logger.js index e06eaab74..8a528a97c 100644 --- a/packages/core/test/tools/fetch-logger.js +++ b/packages/core/test/tools/fetch-logger.js @@ -204,4 +204,27 @@ describe('wrap fetch with logger', () => { // No logs should be created assert.equal(logs.length, 0); }); + + it('should not reuse logger between calls', async () => { + const otherLogs = []; + const anotherLogger = (message, data) => { + otherLogs.push({ message, data }); + }; + const evenNewerFetch = wrapFetchWithLogger(newFetch, anotherLogger); + + const url = `${HTTPBIN_URL}/get`; + const response = await evenNewerFetch(url); + + assert.equal(response.status, 200); + assert.equal(logs.length, 0); + + assert.equal(otherLogs.length, 1); + + const log = otherLogs[0]; + assert.equal(log.message, `200 GET ${url}`); + assert.equal(log.data.request_url, url); + assert.equal(log.data.request_method, 'GET'); + assert.equal(log.data.request_data, ''); + assert.equal(log.data.response_status_code, 200); + }); });