From aa8e55d6696256d46482c89393ee03eec5b2ee21 Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Fri, 21 Nov 2025 21:43:08 +0530 Subject: [PATCH 1/4] Added proxy support --- .talismanrc | 2 + .../src/contentstack-management-sdk.ts | 67 ++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/.talismanrc b/.talismanrc index f07cf8daaa..e9c965fa8f 100644 --- a/.talismanrc +++ b/.talismanrc @@ -221,4 +221,6 @@ fileignoreconfig: checksum: 57566af0bbd95a28b454e4436b0396dfec2fe05ddd5b448d46e3a8b68db8b9cb - filename: packages/contentstack-export/test/unit/export/modules/entries.test.ts checksum: 5950c6f697224e11bec32736e6a967b0ab7ac98e9c8f8bb8eaaf10af60913e40 +- filename: packages/contentstack-utilities/src/contentstack-management-sdk.ts + checksum: 2b20b992391cb4b321c415630eea0a00a890470a3f4a47fbc9e3e80b8760470c version: "1.0" diff --git a/packages/contentstack-utilities/src/contentstack-management-sdk.ts b/packages/contentstack-utilities/src/contentstack-management-sdk.ts index f2257b4def..e350a25d6b 100644 --- a/packages/contentstack-utilities/src/contentstack-management-sdk.ts +++ b/packages/contentstack-utilities/src/contentstack-management-sdk.ts @@ -13,13 +13,49 @@ class ManagementSDKInitiator { } async createAPIClient(config): Promise { + // Get proxy configuration with priority: config.proxy > configStore.proxy > HTTPS_PROXY > HTTP_PROXY + let proxyConfig = config.proxy; + + // Check global config store if not provided in config + if (!proxyConfig) { + proxyConfig = configStore.get('proxy'); + } + + // Check environment variables if still not found + if (!proxyConfig) { + const proxyUrl = process.env.HTTPS_PROXY || process.env.HTTP_PROXY; + if (proxyUrl) { + // Parse URL string into proxy object format (SDK expects object with host, port, protocol) + try { + const url = new URL(proxyUrl); + const parsedProxy: any = { + protocol: url.protocol.replace(':', '') as 'http' | 'https', + host: url.hostname, + port: Number.parseInt(url.port) || (url.protocol === 'https:' ? 443 : 80), + }; + // Include auth if present in URL + if (url.username || url.password) { + parsedProxy.auth = { + username: url.username, + password: url.password, + }; + } + proxyConfig = parsedProxy; + } catch (error) { + // If URL parsing fails, ignore proxy config + proxyConfig = undefined; + } + } + } + const option: ContentstackConfig = { host: config.host, maxContentLength: config.maxContentLength || 100000000, maxBodyLength: config.maxBodyLength || 1000000000, maxRequests: 10, retryLimit: 3, - timeout: 60000, + // Reduce timeout when proxy is configured to fail faster on invalid proxy + timeout: proxyConfig ? 10000 : 60000, // 10s timeout with proxy, 60s without delayMs: config.delayMs, httpsAgent: new Agent({ maxSockets: 100, @@ -76,6 +112,35 @@ class ManagementSDKInitiator { }, }; + // Set proxy configuration if found + if (proxyConfig) { + if (typeof proxyConfig === 'object') { + option.proxy = proxyConfig; + // Log proxy configuration for debugging (enable with DEBUG_PROXY=true) + if (process.env.DEBUG_PROXY === 'true') { + console.log('[PROXY] Using proxy:', JSON.stringify(proxyConfig)); + } + } else if (typeof proxyConfig === 'string') { + // If proxy is provided as string URL, parse it to object format + try { + const url = new URL(proxyConfig); + const parsedProxy: any = { + protocol: url.protocol.replace(':', '') as 'http' | 'https', + host: url.hostname, + port: Number.parseInt(url.port) || (url.protocol === 'https:' ? 443 : 80), + }; + if (url.username || url.password) { + parsedProxy.auth = { + username: url.username, + password: url.password, + }; + } + option.proxy = parsedProxy; + } catch { + // If URL parsing fails, ignore proxy config + } + } + } if (config.endpoint) { option.endpoint = config.endpoint; } From 4fa8521abdc6cdce1b76aeed67da8036f2efac5e Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Wed, 26 Nov 2025 14:20:58 +0530 Subject: [PATCH 2/4] Fixed PR comments --- .talismanrc | 2 +- .../src/contentstack-management-sdk.ts | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.talismanrc b/.talismanrc index e9c965fa8f..75608d297a 100644 --- a/.talismanrc +++ b/.talismanrc @@ -222,5 +222,5 @@ fileignoreconfig: - filename: packages/contentstack-export/test/unit/export/modules/entries.test.ts checksum: 5950c6f697224e11bec32736e6a967b0ab7ac98e9c8f8bb8eaaf10af60913e40 - filename: packages/contentstack-utilities/src/contentstack-management-sdk.ts - checksum: 2b20b992391cb4b321c415630eea0a00a890470a3f4a47fbc9e3e80b8760470c + checksum: 3e6f6cf2a88632069a1c4c8fffa76f9631b29f5bb917fff9da8bca36fd5e192f version: "1.0" diff --git a/packages/contentstack-utilities/src/contentstack-management-sdk.ts b/packages/contentstack-utilities/src/contentstack-management-sdk.ts index e350a25d6b..6ff6e2c86c 100644 --- a/packages/contentstack-utilities/src/contentstack-management-sdk.ts +++ b/packages/contentstack-utilities/src/contentstack-management-sdk.ts @@ -118,7 +118,14 @@ class ManagementSDKInitiator { option.proxy = proxyConfig; // Log proxy configuration for debugging (enable with DEBUG_PROXY=true) if (process.env.DEBUG_PROXY === 'true') { - console.log('[PROXY] Using proxy:', JSON.stringify(proxyConfig)); + const safeProxyConfig = { ...proxyConfig }; + if (safeProxyConfig.auth) { + safeProxyConfig.auth = { + username: safeProxyConfig.auth.username || '', + password: safeProxyConfig.auth.password ? 'REDACTED' : undefined, + }; + } + console.log('[PROXY] Using proxy:', JSON.stringify(safeProxyConfig)); } } else if (typeof proxyConfig === 'string') { // If proxy is provided as string URL, parse it to object format From 4abb2b7221832acf4d3dbe9838aca367341c6bc8 Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Wed, 26 Nov 2025 14:25:25 +0530 Subject: [PATCH 3/4] Fixed PR comments --- .../contentstack-utilities/src/contentstack-management-sdk.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contentstack-utilities/src/contentstack-management-sdk.ts b/packages/contentstack-utilities/src/contentstack-management-sdk.ts index 6ff6e2c86c..9947d52feb 100644 --- a/packages/contentstack-utilities/src/contentstack-management-sdk.ts +++ b/packages/contentstack-utilities/src/contentstack-management-sdk.ts @@ -121,7 +121,7 @@ class ManagementSDKInitiator { const safeProxyConfig = { ...proxyConfig }; if (safeProxyConfig.auth) { safeProxyConfig.auth = { - username: safeProxyConfig.auth.username || '', + username: safeProxyConfig.auth.username ? 'REDACTED' : undefined, password: safeProxyConfig.auth.password ? 'REDACTED' : undefined, }; } From 01beab5c8bf1be34d7fe4e86aa0cf688d28c8ba8 Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Wed, 26 Nov 2025 14:37:07 +0530 Subject: [PATCH 4/4] Fixed PR comments --- .../src/contentstack-management-sdk.ts | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/contentstack-utilities/src/contentstack-management-sdk.ts b/packages/contentstack-utilities/src/contentstack-management-sdk.ts index 9947d52feb..afc9a9cf28 100644 --- a/packages/contentstack-utilities/src/contentstack-management-sdk.ts +++ b/packages/contentstack-utilities/src/contentstack-management-sdk.ts @@ -43,6 +43,9 @@ class ManagementSDKInitiator { proxyConfig = parsedProxy; } catch (error) { // If URL parsing fails, ignore proxy config + if (process.env.DEBUG_PROXY === 'true') { + console.log('[PROXY] Failed to parse proxy URL:', error instanceof Error ? error.message : String(error)); + } proxyConfig = undefined; } } @@ -118,13 +121,18 @@ class ManagementSDKInitiator { option.proxy = proxyConfig; // Log proxy configuration for debugging (enable with DEBUG_PROXY=true) if (process.env.DEBUG_PROXY === 'true') { - const safeProxyConfig = { ...proxyConfig }; - if (safeProxyConfig.auth) { - safeProxyConfig.auth = { - username: safeProxyConfig.auth.username ? 'REDACTED' : undefined, - password: safeProxyConfig.auth.password ? 'REDACTED' : undefined, - }; - } + // Only log non-sensitive proxy information + const safeProxyConfig: any = { + protocol: proxyConfig.protocol, + port: proxyConfig.port, + // Host is redacted as it may contain sensitive internal network information + host: proxyConfig.host ? 'REDACTED' : undefined, + // Auth information is always redacted + auth: proxyConfig.auth ? { + username: proxyConfig.auth.username ? 'REDACTED' : undefined, + password: proxyConfig.auth.password ? 'REDACTED' : undefined, + } : undefined, + }; console.log('[PROXY] Using proxy:', JSON.stringify(safeProxyConfig)); } } else if (typeof proxyConfig === 'string') {