From 17e19cb647f9d5e065c66ee92ea7ffacf668bc03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Thu, 18 Apr 2024 12:03:28 +0200 Subject: [PATCH] make it work with redirects --- packages/core/src/NodeExecuteFunctions.ts | 11 +---- .../core/test/NodeExecuteFunctions.test.ts | 45 ++++++++++++------- .../nodes/HttpRequest/GenericFunctions.ts | 5 ++- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/packages/core/src/NodeExecuteFunctions.ts b/packages/core/src/NodeExecuteFunctions.ts index 5e2f94b705a9c..48e20db14bcf9 100644 --- a/packages/core/src/NodeExecuteFunctions.ts +++ b/packages/core/src/NodeExecuteFunctions.ts @@ -497,7 +497,7 @@ export async function parseRequestObject(requestObject: IRequestOptions) { } const host = getHostFromRequestObject(requestObject); - const agentOptions: AgentOptions = {}; + const agentOptions: AgentOptions = { ...requestObject.agentOptions }; if (host) { agentOptions.servername = host; } @@ -506,14 +506,7 @@ export async function parseRequestObject(requestObject: IRequestOptions) { agentOptions.secureOptions = crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT; } - if (requestObject.agentOptions) { - axiosConfig.httpsAgent = new Agent({ - ...agentOptions, - ...requestObject.agentOptions, - }); - } else { - axiosConfig.httpsAgent = new Agent(agentOptions); - } + axiosConfig.httpsAgent = new Agent(agentOptions); axiosConfig.beforeRedirect = getBeforeRedirectFn(agentOptions, axiosConfig); diff --git a/packages/core/test/NodeExecuteFunctions.test.ts b/packages/core/test/NodeExecuteFunctions.test.ts index 93b08cdb32a4f..e4c4efc7c168c 100644 --- a/packages/core/test/NodeExecuteFunctions.test.ts +++ b/packages/core/test/NodeExecuteFunctions.test.ts @@ -1,3 +1,4 @@ +import type { SecureContextOptions } from 'tls'; import { cleanupParameterData, copyInputItems, @@ -387,26 +388,38 @@ describe('NodeExecuteFunctions', () => { expect((axiosOptions.httpsAgent as Agent).options.servername).toEqual('example.de'); }); - test('should set ssl certificates', async () => { - const axiosOptions = await parseRequestObject({ + describe('should set SSL certificates', () => { + const agentOptions: SecureContextOptions = { + ca: '-----BEGIN CERTIFICATE-----\nTEST\n-----END CERTIFICATE-----', + }; + const requestObject: IRequestOptions = { method: 'GET', uri: 'https://example.de', - agentOptions: { - cert: undefined, - ca: '-----BEGIN CERTIFICATE-----\nTEST\n-----END CERTIFICATE-----', - key: undefined, - passphrase: undefined, - }, + agentOptions, + }; + + test('on regular requests', async () => { + const axiosOptions = await parseRequestObject(requestObject); + expect((axiosOptions.httpsAgent as Agent).options).toEqual({ + servername: 'example.de', + ...agentOptions, + noDelay: true, + path: null, + }); }); - expect((axiosOptions.httpsAgent as Agent).options).toEqual({ - servername: 'example.de', - cert: undefined, - ca: '-----BEGIN CERTIFICATE-----\nTEST\n-----END CERTIFICATE-----', - key: undefined, - passphrase: undefined, - noDelay: true, - path: null, + test('on redirected requests', async () => { + const axiosOptions = await parseRequestObject(requestObject); + expect(axiosOptions.beforeRedirect).toBeDefined; + const redirectOptions: Record = { agents: {}, hostname: 'example.de' }; + axiosOptions.beforeRedirect!(redirectOptions, mock()); + expect(redirectOptions.agent).toEqual(redirectOptions.agents.https); + expect((redirectOptions.agent as Agent).options).toEqual({ + servername: 'example.de', + ...agentOptions, + noDelay: true, + path: null, + }); }); }); diff --git a/packages/nodes-base/nodes/HttpRequest/GenericFunctions.ts b/packages/nodes-base/nodes/HttpRequest/GenericFunctions.ts index 15f61effd7b78..778f03764c4ce 100644 --- a/packages/nodes-base/nodes/HttpRequest/GenericFunctions.ts +++ b/packages/nodes-base/nodes/HttpRequest/GenericFunctions.ts @@ -1,3 +1,4 @@ +import type { SecureContextOptions } from 'tls'; import type { IDataObject, INodeExecutionData, @@ -202,13 +203,13 @@ export const setAgentOptions = ( sslCertificates: HttpSslAuthCredentials | undefined, ) => { if (sslCertificates) { - const agentOptions = { + const agentOptions: SecureContextOptions = { cert: sslCertificates.cert ? formatPrivateKey(sslCertificates.cert) : undefined, ca: sslCertificates.ca ? formatPrivateKey(sslCertificates.ca) : undefined, key: sslCertificates.key ? formatPrivateKey(sslCertificates.key) : undefined, passphrase: sslCertificates.passphrase || undefined, }; - requestOptions.agentOptions = agentOptions; + requestOptions.agentOptions = { ...agentOptions }; } };