From c2bdddaa5934ba25a1cdf5d23293cdbe5194f325 Mon Sep 17 00:00:00 2001 From: Chris Wilper Date: Fri, 20 Oct 2023 09:51:40 -0400 Subject: [PATCH 1/4] chore: consolidate prerequest-related code --- .../bruno-electron/src/ipc/network/index.js | 235 +++++++----------- .../src/ipc/network/prepare-request.js | 9 + 2 files changed, 105 insertions(+), 139 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index f092e9ee9..5b0ba6582 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -189,6 +189,81 @@ const parseDataFromResponse = (response) => { }; const registerNetworkIpc = (mainWindow) => { + const onConsoleLog = (type, args) => { + console[type](...args); + + mainWindow.webContents.send('main:console-log', { + type, + args + }); + }; + + const runPreRequest = async ( + request, + requestUid, + envVars, + collectionPath, + collectionRoot, + collectionUid, + collectionVariables, + processEnvVars, + scriptingConfig + ) => { + // run pre-request vars + const preRequestVars = get(request, 'vars.req', []); + if (preRequestVars?.length) { + const varsRuntime = new VarsRuntime(); + const result = varsRuntime.runPreRequestVars( + preRequestVars, + request, + envVars, + collectionVariables, + collectionPath, + processEnvVars + ); + + if (result) { + mainWindow.webContents.send('main:script-environment-update', { + envVariables: result.envVariables, + collectionVariables: result.collectionVariables, + requestUid, + collectionUid + }); + } + } + + // run pre-request script + const requestScript = compact([get(collectionRoot, 'request.script.req'), get(request, 'script.req')]).join(os.EOL); + if (requestScript?.length) { + const scriptRuntime = new ScriptRuntime(); + const result = await scriptRuntime.runRequestScript( + decomment(requestScript), + request, + envVars, + collectionVariables, + collectionPath, + onConsoleLog, + processEnvVars, + scriptingConfig + ); + + mainWindow.webContents.send('main:script-environment-update', { + envVariables: result.envVariables, + collectionVariables: result.collectionVariables, + requestUid, + collectionUid + }); + } + + // interpolate variables inside request + interpolateVars(request, envVars, collectionVariables, processEnvVars); + + // stringify the request url encoded params + if (request.headers['content-type'] === 'application/x-www-form-urlencoded') { + request.data = qs.stringify(request.data); + } + }; + // handler for sending http request ipcMain.handle('send-http-request', async (event, item, collection, environment, collectionVariables) => { const collectionUid = collection.uid; @@ -196,15 +271,6 @@ const registerNetworkIpc = (mainWindow) => { const cancelTokenUid = uuid(); const requestUid = uuid(); - const onConsoleLog = (type, args) => { - console[type](...args); - - mainWindow.webContents.send('main:console-log', { - type, - args - }); - }; - mainWindow.webContents.send('main:run-request-event', { type: 'request-queued', requestUid, @@ -222,75 +288,21 @@ const registerNetworkIpc = (mainWindow) => { const scriptingConfig = get(brunoConfig, 'scripts', {}); try { - // make axios work in node using form data - // reference: https://github.com/axios/axios/issues/1006#issuecomment-320165427 - if (request.headers && request.headers['content-type'] === 'multipart/form-data') { - const form = new FormData(); - forOwn(request.data, (value, key) => { - form.append(key, value); - }); - extend(request.headers, form.getHeaders()); - request.data = form; - } - const cancelToken = axios.CancelToken.source(); request.cancelToken = cancelToken.token; saveCancelToken(cancelTokenUid, cancelToken); - // run pre-request vars - const preRequestVars = get(request, 'vars.req', []); - if (preRequestVars?.length) { - const varsRuntime = new VarsRuntime(); - const result = varsRuntime.runPreRequestVars( - preRequestVars, - request, - envVars, - collectionVariables, - collectionPath, - processEnvVars - ); - - if (result) { - mainWindow.webContents.send('main:script-environment-update', { - envVariables: result.envVariables, - collectionVariables: result.collectionVariables, - requestUid, - collectionUid - }); - } - } - - // run pre-request script - const requestScript = compact([get(collectionRoot, 'request.script.req'), get(request, 'script.req')]).join( - os.EOL + await runPreRequest( + request, + requestUid, + envVars, + collectionPath, + collectionRoot, + collectionUid, + collectionVariables, + processEnvVars, + scriptingConfig ); - if (requestScript?.length) { - const scriptRuntime = new ScriptRuntime(); - const result = await scriptRuntime.runRequestScript( - decomment(requestScript), - request, - envVars, - collectionVariables, - collectionPath, - onConsoleLog, - processEnvVars, - scriptingConfig - ); - - mainWindow.webContents.send('main:script-environment-update', { - envVariables: result.envVariables, - collectionVariables: result.collectionVariables, - requestUid, - collectionUid - }); - } - - interpolateVars(request, envVars, collectionVariables, processEnvVars); - - // stringify the request url encoded params - if (request.headers['content-type'] === 'application/x-www-form-urlencoded') { - request.data = qs.stringify(request.data); - } // todo: // i have no clue why electron can't send the request object @@ -544,15 +556,6 @@ const registerNetworkIpc = (mainWindow) => { const scriptingConfig = get(brunoConfig, 'scripts', {}); const collectionRoot = get(collection, 'root', {}); - const onConsoleLog = (type, args) => { - console[type](...args); - - mainWindow.webContents.send('main:console-log', { - type, - args - }); - }; - if (!folder) { folder = collection; } @@ -602,67 +605,21 @@ const registerNetworkIpc = (mainWindow) => { const _request = item.draft ? item.draft.request : item.request; const request = prepareRequest(_request, collectionRoot); + const requestUid = uuid(); const processEnvVars = getProcessEnvVars(collectionUid); try { - // make axios work in node using form data - // reference: https://github.com/axios/axios/issues/1006#issuecomment-320165427 - if (request.headers && request.headers['content-type'] === 'multipart/form-data') { - const form = new FormData(); - forOwn(request.data, (value, key) => { - form.append(key, value); - }); - extend(request.headers, form.getHeaders()); - request.data = form; - } - - // run pre-request vars - const preRequestVars = get(request, 'vars.req', []); - if (preRequestVars && preRequestVars.length) { - const varsRuntime = new VarsRuntime(); - const result = varsRuntime.runPreRequestVars( - preRequestVars, - request, - envVars, - collectionVariables, - collectionPath - ); - - if (result) { - mainWindow.webContents.send('main:script-environment-update', { - envVariables: result.envVariables, - collectionVariables: result.collectionVariables, - collectionUid - }); - } - } - - // run pre-request script - const requestScript = compact([get(collectionRoot, 'request.script.req'), get(request, 'script.req')]).join( - os.EOL + await runPreRequest( + request, + requestUid, + envVars, + collectionPath, + collectionRoot, + collectionUid, + collectionVariables, + processEnvVars, + scriptingConfig ); - if (requestScript?.length) { - const scriptRuntime = new ScriptRuntime(); - const result = await scriptRuntime.runRequestScript( - decomment(requestScript), - request, - envVars, - collectionVariables, - collectionPath, - onConsoleLog, - processEnvVars, - scriptingConfig - ); - - mainWindow.webContents.send('main:script-environment-update', { - envVariables: result.envVariables, - collectionVariables: result.collectionVariables, - collectionUid - }); - } - - // interpolate variables inside request - interpolateVars(request, envVars, collectionVariables, processEnvVars); // todo: // i have no clue why electron can't send the request object diff --git a/packages/bruno-electron/src/ipc/network/prepare-request.js b/packages/bruno-electron/src/ipc/network/prepare-request.js index 6c2d7d4b3..6e3f123c1 100644 --- a/packages/bruno-electron/src/ipc/network/prepare-request.js +++ b/packages/bruno-electron/src/ipc/network/prepare-request.js @@ -137,6 +137,15 @@ const prepareRequest = (request, collectionRoot) => { each(enabledParams, (p) => (params[p.name] = p.value)); axiosRequest.headers['content-type'] = 'multipart/form-data'; axiosRequest.data = params; + + // make axios work in node using form data + // reference: https://github.com/axios/axios/issues/1006#issuecomment-320165427 + const form = new FormData(); + forOwn(axiosRequest.data, (value, key) => { + form.append(key, value); + }); + extend(axiosRequest.headers, form.getHeaders()); + axiosRequest.data = form; } if (request.body.mode === 'graphql') { From 846ac66ca365b4d8a4b4ae4d7dcc9c3660872572 Mon Sep 17 00:00:00 2001 From: Chris Wilper Date: Fri, 20 Oct 2023 10:56:50 -0400 Subject: [PATCH 2/4] feat: run prerequest code before gql schema fetch --- .../bruno-electron/src/ipc/network/index.js | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 5b0ba6582..01d1658e4 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -514,8 +514,25 @@ const registerNetworkIpc = (mainWindow) => { }); } - const processEnvVars = getProcessEnvVars(collection.uid); - interpolateVars(preparedRequest, envVars, collection.collectionVariables, processEnvVars); + const requestUid = uuid(); + const collectionPath = collection.pathname; + const collectionUid = collection.uid; + const collectionVariables = collection.collectionVariables; + const processEnvVars = getProcessEnvVars(collectionUid); + const brunoConfig = getBrunoConfig(collection.uid); + const scriptingConfig = get(brunoConfig, 'scripts', {}); + + await runPreRequest( + request, + requestUid, + envVars, + collectionPath, + collectionRoot, + collectionUid, + collectionVariables, + processEnvVars, + scriptingConfig + ); const axiosInstance = await configureRequest( collection.uid, From 7e8073cbdbf4ccdb806b5dedd55334103bde7a31 Mon Sep 17 00:00:00 2001 From: Chris Wilper Date: Fri, 20 Oct 2023 11:49:12 -0400 Subject: [PATCH 3/4] chore: consolidate postresponse-related code --- .../bruno-electron/src/ipc/network/index.js | 182 +++++++++--------- 1 file changed, 86 insertions(+), 96 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 01d1658e4..4dca5ae01 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -264,6 +264,69 @@ const registerNetworkIpc = (mainWindow) => { } }; + const runPostResponse = async ( + request, + response, + requestUid, + envVars, + collectionPath, + collectionRoot, + collectionUid, + collectionVariables, + processEnvVars, + scriptingConfig + ) => { + // run post-response vars + const postResponseVars = get(request, 'vars.res', []); + if (postResponseVars?.length) { + const varsRuntime = new VarsRuntime(); + const result = varsRuntime.runPostResponseVars( + postResponseVars, + request, + response, + envVars, + collectionVariables, + collectionPath, + processEnvVars + ); + + if (result) { + mainWindow.webContents.send('main:script-environment-update', { + envVariables: result.envVariables, + collectionVariables: result.collectionVariables, + requestUid, + collectionUid + }); + } + } + + // run post-response script + const responseScript = compact([get(collectionRoot, 'request.script.res'), get(request, 'script.res')]).join( + os.EOL + ); + if (responseScript?.length) { + const scriptRuntime = new ScriptRuntime(); + const result = await scriptRuntime.runResponseScript( + decomment(responseScript), + request, + response, + envVars, + collectionVariables, + collectionPath, + onConsoleLog, + processEnvVars, + scriptingConfig + ); + + mainWindow.webContents.send('main:script-environment-update', { + envVariables: result.envVariables, + collectionVariables: result.collectionVariables, + requestUid, + collectionUid + }); + } + }; + // handler for sending http request ipcMain.handle('send-http-request', async (event, item, collection, environment, collectionVariables) => { const collectionUid = collection.uid; @@ -365,55 +428,18 @@ const registerNetworkIpc = (mainWindow) => { const { data, dataBuffer } = parseDataFromResponse(response); response.data = data; - // run post-response vars - const postResponseVars = get(request, 'vars.res', []); - if (postResponseVars?.length) { - const varsRuntime = new VarsRuntime(); - const result = varsRuntime.runPostResponseVars( - postResponseVars, - request, - response, - envVars, - collectionVariables, - collectionPath, - processEnvVars - ); - - if (result) { - mainWindow.webContents.send('main:script-environment-update', { - envVariables: result.envVariables, - collectionVariables: result.collectionVariables, - requestUid, - collectionUid - }); - } - } - - // run post-response script - const responseScript = compact([get(collectionRoot, 'request.script.res'), get(request, 'script.res')]).join( - os.EOL + await runPostResponse( + request, + response, + requestUid, + envVars, + collectionPath, + collectionRoot, + collectionUid, + collectionVariables, + processEnvVars, + scriptingConfig ); - if (responseScript?.length) { - const scriptRuntime = new ScriptRuntime(); - const result = await scriptRuntime.runResponseScript( - decomment(responseScript), - request, - response, - envVars, - collectionVariables, - collectionPath, - onConsoleLog, - processEnvVars, - scriptingConfig - ); - - mainWindow.webContents.send('main:script-environment-update', { - envVariables: result.envVariables, - collectionVariables: result.collectionVariables, - requestUid, - collectionUid - }); - } // run assertions const assertions = get(request, 'assertions'); @@ -712,54 +738,18 @@ const registerNetworkIpc = (mainWindow) => { } } - // run post-response vars - const postResponseVars = get(request, 'vars.res', []); - if (postResponseVars?.length) { - const varsRuntime = new VarsRuntime(); - const result = varsRuntime.runPostResponseVars( - postResponseVars, - request, - response, - envVars, - collectionVariables, - collectionPath, - processEnvVars - ); - - if (result) { - mainWindow.webContents.send('main:script-environment-update', { - envVariables: result.envVariables, - collectionVariables: result.collectionVariables, - collectionUid - }); - } - } - - // run response script - const responseScript = compact([ - get(collectionRoot, 'request.script.res'), - get(request, 'script.res') - ]).join(os.EOL); - if (responseScript && responseScript.length) { - const scriptRuntime = new ScriptRuntime(); - const result = await scriptRuntime.runResponseScript( - decomment(responseScript), - request, - response, - envVars, - collectionVariables, - collectionPath, - onConsoleLog, - processEnvVars, - scriptingConfig - ); - - mainWindow.webContents.send('main:script-environment-update', { - envVariables: result.envVariables, - collectionVariables: result.collectionVariables, - collectionUid - }); - } + await runPostResponse( + request, + response, + requestUid, + envVars, + collectionPath, + collectionRoot, + collectionUid, + collectionVariables, + processEnvVars, + scriptingConfig + ); // run assertions const assertions = get(item, 'request.assertions'); From a6ddf12ee117376b7f6019951750a5ff648caef3 Mon Sep 17 00:00:00 2001 From: Chris Wilper Date: Fri, 20 Oct 2023 12:13:35 -0400 Subject: [PATCH 4/4] feat: run postrequest code after gql schema fetch --- packages/bruno-electron/src/ipc/network/index.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 4dca5ae01..52922516b 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -569,6 +569,19 @@ const registerNetworkIpc = (mainWindow) => { ); const response = await axiosInstance(preparedRequest); + await runPostResponse( + request, + response, + requestUid, + envVars, + collectionPath, + collectionRoot, + collectionUid, + collectionVariables, + processEnvVars, + scriptingConfig + ); + return { status: response.status, statusText: response.statusText,