diff --git a/packages/bruno-cli/src/runner/run-single-request.js b/packages/bruno-cli/src/runner/run-single-request.js index cd265af22..43b801208 100644 --- a/packages/bruno-cli/src/runner/run-single-request.js +++ b/packages/bruno-cli/src/runner/run-single-request.js @@ -9,7 +9,8 @@ const { interpolateString, interpolateObject } = require('./interpolate-string') const { ScriptRuntime, TestRuntime, VarsRuntime, AssertRuntime, formatErrorWithContext, SCRIPT_TYPES } = require('@usebruno/js'); const { stripExtension } = require('../utils/filesystem'); const { getOptions } = require('../utils/bru'); -const https = require('https'); +const https = require('node:https'); +const http = require('node:http'); const { HttpProxyAgent } = require('http-proxy-agent'); const { SocksProxyAgent } = require('socks-proxy-agent'); const { makeAxiosInstance } = require('../utils/axios-instance'); @@ -22,7 +23,7 @@ const { createFormData } = require('../utils/form-data'); const protocolRegex = /^([-+\w]{1,25})(:?\/\/|:)/; const { NtlmClient } = require('axios-ntlm'); const { addDigestInterceptor, getHttpHttpsAgents, makeAxiosInstance: makeAxiosInstanceForOauth2 } = require('@usebruno/requests'); -const { getCACertificates, transformProxyConfig } = require('@usebruno/requests'); +const { getCACertificates, transformProxyConfig, getOrCreateAgent, getOrCreateHttpAgent } = require('@usebruno/requests'); const { getOAuth2Token, getFormattedOauth2Credentials } = require('../utils/oauth2'); const tokenStore = require('../store/tokenStore'); const { encodeUrl, buildFormUrlEncodedPayload, extractPromptVariables, isFormData } = require('@usebruno/common').utils; @@ -432,6 +433,9 @@ const runSingleRequest = async function ( keepAlive: true }; + const parsedRequestUrl = new URL(request.url); + const isHttpsRequest = parsedRequestUrl.protocol === 'https:'; + if (proxyMode === 'on') { const shouldProxy = shouldUseProxy(request.url, get(proxyConfig, 'bypassProxy', '')); if (shouldProxy) { @@ -450,27 +454,30 @@ const runSingleRequest = async function ( } else { proxyUri = `${proxyProtocol}://${proxyHostname}${uriPort}`; } + // Only set the agent needed for the request protocol if (socksEnabled) { - request.httpAgent = getOrCreateAgent(SocksProxyAgent, { keepAlive: true }, proxyUri); - request.httpsAgent = getOrCreateAgent(SocksProxyAgent, tlsOptions, proxyUri); + if (isHttpsRequest) { + request.httpsAgent = getOrCreateAgent(SocksProxyAgent, tlsOptions, proxyUri); + } else { + request.httpAgent = getOrCreateHttpAgent(SocksProxyAgent, { keepAlive: true }, proxyUri); + } } else { - request.httpAgent = getOrCreateAgent(HttpProxyAgent, { keepAlive: true }, proxyUri); - request.httpsAgent = getOrCreateAgent(PatchedHttpsProxyAgent, tlsOptions, proxyUri); + if (isHttpsRequest) { + request.httpsAgent = getOrCreateAgent(PatchedHttpsProxyAgent, tlsOptions, proxyUri); + } else { + request.httpAgent = getOrCreateHttpAgent(HttpProxyAgent, { keepAlive: true }, proxyUri); + } } - } else { - request.httpsAgent = getOrCreateAgent(https.Agent, tlsOptions); } } else if (proxyMode === 'system') { try { const { http_proxy, https_proxy, no_proxy } = cachedSystemProxy || {}; const shouldUseSystemProxy = shouldUseProxy(request.url, no_proxy || ''); - const parsedUrl = new URL(request.url); - const isHttpsRequest = parsedUrl.protocol === 'https:'; if (shouldUseSystemProxy) { try { if (http_proxy?.length && !isHttpsRequest) { new URL(http_proxy); - request.httpAgent = getOrCreateAgent(HttpProxyAgent, { keepAlive: true }, http_proxy); + request.httpAgent = getOrCreateHttpAgent(HttpProxyAgent, { keepAlive: true }, http_proxy); } } catch (error) { throw new Error('Invalid system http_proxy'); @@ -485,16 +492,19 @@ const runSingleRequest = async function ( } catch (error) { throw new Error('Invalid system https_proxy'); } - } else { - request.httpsAgent = new https.Agent({ - ...httpsAgentRequestFields - }); } } catch (error) { - request.httpsAgent = getOrCreateAgent(https.Agent, tlsOptions); + // Log system proxy detection errors but continue without proxy + console.warn('Failed to configure system proxy:', error.message); + } + } + + if (!request.httpAgent && !request.httpsAgent) { + if (isHttpsRequest) { + request.httpsAgent = getOrCreateAgent(https.Agent, tlsOptions, null); + } else { + request.httpAgent = getOrCreateHttpAgent(http.Agent, { keepAlive: true }, null); } - } else if (Object.keys(httpsAgentRequestFields).length > 0) { - request.httpsAgent = getOrCreateAgent(https.Agent, tlsOptions); } // set cookies if enabled