diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 8345e7ee79..3a078ee3d7 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -13,7 +13,6 @@ const { ipcMain } = require('electron'); const { isUndefined, isNull, each, get, compact, cloneDeep } = require('lodash'); const { VarsRuntime, AssertRuntime, ScriptRuntime, TestRuntime } = require('@usebruno/js'); const prepareRequest = require('./prepare-request'); -const prepareCollectionRequest = require('./prepare-collection-request'); const prepareGqlIntrospectionRequest = require('./prepare-gql-introspection-request'); const { cancelTokens, saveCancelToken, deleteCancelToken } = require('../../utils/cancel-token'); const { uuid } = require('../../utils/common'); @@ -208,22 +207,25 @@ const configureRequest = async ( switch (request?.oauth2?.grantType) { case 'authorization_code': { interpolateVars(requestCopy, envVars, collectionVariables, processEnvVars); - const { oauth2Data } = await getOAuth2DataAuthorizationCode(requestCopy, collectionUid); + const { oauth2Data, response } = await getOAuth2DataAuthorizationCode(requestCopy, collectionUid); request.credentials = oauth2Data; + request.authRequestResponse = response; request.headers['Authorization'] = `Bearer ${oauth2Data.access_token}`; break; } case 'client_credentials': { interpolateVars(requestCopy, envVars, collectionVariables, processEnvVars); - const { oauth2Data } = await getOAuth2DataClientCredentials(requestCopy, collectionUid); + const { oauth2Data, response } = await getOAuth2DataClientCredentials(requestCopy, collectionUid); request.credentials = oauth2Data; + request.authRequestResponse = response; request.headers['Authorization'] = `Bearer ${oauth2Data.access_token}`; break; } case 'password': { interpolateVars(requestCopy, envVars, collectionVariables, processEnvVars); - const { oauth2Data } = await getOAuth2DataPasswordCredentials(requestCopy, collectionUid); + const { oauth2Data, response } = await getOAuth2DataPasswordCredentials(requestCopy, collectionUid); request.credentials = oauth2Data; + request.authRequestResponse = response; request.headers['Authorization'] = `Bearer ${oauth2Data.access_token}`; break; } @@ -231,6 +233,9 @@ const configureRequest = async ( interpolateVars(requestCopy, envVars, collectionVariables, processEnvVars); const { oauth2Data } = await getOAuth2DataImplicit(requestCopy, collectionUid); request.credentials = oauth2Data; + request.authRequestResponse = { + /*none*/ + }; request.headers['Authorization'] = `Bearer ${oauth2Data.access_token}`; break; } @@ -638,7 +643,8 @@ const registerNetworkIpc = (mainWindow) => { const collectionRoot = get(collection, 'root', {}); const _request = collectionRoot?.request; - const request = prepareCollectionRequest(_request, collectionRoot, collectionPath); + const request = prepareRequest(_request, collectionRoot, collectionPath); + const envVars = getEnvVars(environment); const processEnvVars = getProcessEnvVars(collectionUid); const brunoConfig = getBrunoConfig(collectionUid); @@ -657,7 +663,7 @@ const registerNetworkIpc = (mainWindow) => { ); interpolateVars(request, envVars, collection.collectionVariables, processEnvVars); - const axiosInstance = await configureRequest( + await configureRequest( collection.uid, request, envVars, @@ -666,16 +672,7 @@ const registerNetworkIpc = (mainWindow) => { collectionPath ); - try { - response = await axiosInstance(request); - } catch (error) { - if (error?.response) { - response = error.response; - } else { - return Promise.reject(error); - } - } - + const response = request.authRequestResponse; const { data } = parseDataFromResponse(response); response.data = data; @@ -696,7 +693,8 @@ const registerNetworkIpc = (mainWindow) => { status: response.status, statusText: response.statusText, headers: response.headers, - data: response.data + data: response.data, + credentials: request.credentials }; } catch (error) { return Promise.reject(error); diff --git a/packages/bruno-electron/src/ipc/network/oauth2-helper.js b/packages/bruno-electron/src/ipc/network/oauth2-helper.js index a8c4ab2409..120ed396b3 100644 --- a/packages/bruno-electron/src/ipc/network/oauth2-helper.js +++ b/packages/bruno-electron/src/ipc/network/oauth2-helper.js @@ -60,7 +60,7 @@ const getOAuth2DataAuthorizationCode = async (request, collectionUid) => { const response = await axiosInstance(request); const oauth2Data = JSON.parse(response.data); persistOauth2Data(oauth2Data, collectionUid); - return { oauth2Data }; + return { oauth2Data, response }; }; const getOAuth2AuthorizationCode = (request, codeChallenge, collectionUid) => { @@ -81,7 +81,6 @@ const getOAuth2AuthorizationCode = (request, codeChallenge, collectionUid) => { } const authorizationUrlWithQueryParams = authorizationUrl + oauth2QueryParams; try { - const oauth2Store = new Oauth2Store(); const { authorizationCode } = await authorizeUserInWindow({ authorizeUrl: authorizationUrlWithQueryParams, callbackUrl, @@ -114,7 +113,7 @@ const getOAuth2DataClientCredentials = async (request, collectionUid) => { let response = await axiosInstance(request); let oauth2Data = JSON.parse(response.data); persistOauth2Data(oauth2Data, collectionUid); - return { oauth2Data }; + return { oauth2Data, response }; }; // PASSWORD CREDENTIALS @@ -139,7 +138,7 @@ const getOAuth2DataPasswordCredentials = async (request, collectionUid) => { let response = await axiosInstance(request); let oauth2Data = JSON.parse(response.data); persistOauth2Data(oauth2Data, collectionUid); - return { oauth2Data }; + return { oauth2Data, response }; }; // IMPLICIT diff --git a/packages/bruno-electron/src/ipc/network/prepare-collection-request.js b/packages/bruno-electron/src/ipc/network/prepare-collection-request.js deleted file mode 100644 index 5fd6305948..0000000000 --- a/packages/bruno-electron/src/ipc/network/prepare-collection-request.js +++ /dev/null @@ -1,49 +0,0 @@ -const { get, each } = require('lodash'); -const { setAuthHeaders } = require('./prepare-request'); - -const prepareCollectionRequest = (request, collectionRoot) => { - const headers = {}; - let contentTypeDefined = false; - let url = request.url; - - // collection headers - each(get(collectionRoot, 'request.headers', []), (h) => { - if (h.enabled) { - headers[h.name] = h.value; - if (h.name.toLowerCase() === 'content-type') { - contentTypeDefined = true; - } - } - }); - - each(request.headers, (h) => { - if (h.enabled) { - headers[h.name] = h.value; - if (h.name.toLowerCase() === 'content-type') { - contentTypeDefined = true; - } - } - }); - - let axiosRequest = { - mode: request?.body?.mode, - method: request.method, - url, - headers, - responseType: 'arraybuffer' - }; - - axiosRequest = setAuthHeaders(axiosRequest, request, collectionRoot); - - if (request.script) { - axiosRequest.script = request.script; - } - - axiosRequest.vars = request.vars; - - axiosRequest.method = 'POST'; - - return axiosRequest; -}; - -module.exports = prepareCollectionRequest; diff --git a/packages/bruno-electron/src/ipc/network/prepare-request.js b/packages/bruno-electron/src/ipc/network/prepare-request.js index bc83cc3a6e..c068eac183 100644 --- a/packages/bruno-electron/src/ipc/network/prepare-request.js +++ b/packages/bruno-electron/src/ipc/network/prepare-request.js @@ -177,7 +177,7 @@ const prepareRequest = (request, collectionRoot, collectionPath) => { }); let axiosRequest = { - mode: request.body.mode, + mode: request?.body?.mode, method: request.method, url, headers, @@ -186,7 +186,7 @@ const prepareRequest = (request, collectionRoot, collectionPath) => { axiosRequest = setAuthHeaders(axiosRequest, request, collectionRoot); - if (request.body.mode === 'json') { + if (request.body?.mode === 'json') { if (!contentTypeDefined) { axiosRequest.headers['content-type'] = 'application/json'; } @@ -197,28 +197,28 @@ const prepareRequest = (request, collectionRoot, collectionPath) => { } } - if (request.body.mode === 'text') { + if (request.body?.mode === 'text') { if (!contentTypeDefined) { axiosRequest.headers['content-type'] = 'text/plain'; } axiosRequest.data = request.body.text; } - if (request.body.mode === 'xml') { + if (request.body?.mode === 'xml') { if (!contentTypeDefined) { axiosRequest.headers['content-type'] = 'text/xml'; } axiosRequest.data = request.body.xml; } - if (request.body.mode === 'sparql') { + if (request.body?.mode === 'sparql') { if (!contentTypeDefined) { axiosRequest.headers['content-type'] = 'application/sparql-query'; } axiosRequest.data = request.body.sparql; } - if (request.body.mode === 'formUrlEncoded') { + if (request.body?.mode === 'formUrlEncoded') { axiosRequest.headers['content-type'] = 'application/x-www-form-urlencoded'; const params = {}; const enabledParams = filter(request.body.formUrlEncoded, (p) => p.enabled); @@ -226,14 +226,14 @@ const prepareRequest = (request, collectionRoot, collectionPath) => { axiosRequest.data = params; } - if (request.body.mode === 'multipartForm') { + if (request.body?.mode === 'multipartForm') { const enabledParams = filter(request.body.multipartForm, (p) => p.enabled); const form = parseFormData(enabledParams, collectionPath); extend(axiosRequest.headers, form.getHeaders()); axiosRequest.data = form; } - if (request.body.mode === 'graphql') { + if (request.body?.mode === 'graphql') { const graphqlQuery = { query: get(request, 'body.graphql.query'), // https://github.com/usebruno/bruno/issues/884 - we must only parse the variables after the variable interpolation