diff --git a/packages/nodes-base/utils/sendAndWait/test/util.test.ts b/packages/nodes-base/utils/sendAndWait/test/util.test.ts index 5739757d1a331..aba50e0b391de 100644 --- a/packages/nodes-base/utils/sendAndWait/test/util.test.ts +++ b/packages/nodes-base/utils/sendAndWait/test/util.test.ts @@ -368,6 +368,34 @@ describe('Send and Wait utils tests', () => { expect(result.workflowData).toEqual([[{ json: { data: { 'test 1': 'test value' } } }]]); }); + + it('should return noWebhookResponse if method GET and user-agent is bot', async () => { + mockWebhookFunctions.getRequestObject.mockReturnValue({ + method: 'GET', + headers: { + 'user-agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', + }, + query: { approved: 'false' }, + } as any); + + const send = jest.fn(); + + mockWebhookFunctions.getResponseObject.mockReturnValue({ + send, + } as any); + + mockWebhookFunctions.getNodeParameter.mockImplementation((parameterName: string) => { + const params: { [key: string]: any } = { + responseType: 'approval', + }; + return params[parameterName]; + }); + + const result = await sendAndWaitWebhook.call(mockWebhookFunctions); + + expect(send).toHaveBeenCalledWith(''); + expect(result).toEqual({ noWebhookResponse: true }); + }); }); }); diff --git a/packages/nodes-base/utils/sendAndWait/utils.ts b/packages/nodes-base/utils/sendAndWait/utils.ts index 6fe569825fdba..f9083ea2f9e00 100644 --- a/packages/nodes-base/utils/sendAndWait/utils.ts +++ b/packages/nodes-base/utils/sendAndWait/utils.ts @@ -1,3 +1,4 @@ +import isbot from 'isbot'; import { NodeOperationError, SEND_AND_WAIT_OPERATION, @@ -324,11 +325,18 @@ const getFormResponseCustomizations = (context: IWebhookFunctions) => { export async function sendAndWaitWebhook(this: IWebhookFunctions) { const method = this.getRequestObject().method; const res = this.getResponseObject(); + const req = this.getRequestObject(); + const responseType = this.getNodeParameter('responseType', 'approval') as | 'approval' | 'freeText' | 'customForm'; + if (responseType === 'approval' && isbot(req.headers['user-agent'])) { + res.send(''); + return { noWebhookResponse: true }; + } + if (responseType === 'freeText') { if (method === 'GET') { const { formTitle, formDescription, buttonLabel } = getFormResponseCustomizations(this); @@ -424,7 +432,7 @@ export async function sendAndWaitWebhook(this: IWebhookFunctions) { } } - const query = this.getRequestObject().query as { approved: 'false' | 'true' }; + const query = req.query as { approved: 'false' | 'true' }; const approved = query.approved === 'true'; return { webhookResponse: ACTION_RECORDED_PAGE,