Skip to content

Commit 9dde2df

Browse files
authored
Merge pull request #4661 from devendra-bruno/fix/gql-introspection-variable-interpolation
Added combined Vars for prepareGqlIntrospectionRequest for all interp…
2 parents 223f79a + 6f9daad commit 9dde2df

File tree

5 files changed

+526
-90
lines changed

5 files changed

+526
-90
lines changed

packages/bruno-app/src/components/RequestPane/GraphQLSchemaActions/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import Dropdown from '../../Dropdown';
77

88
const GraphQLSchemaActions = ({ item, collection, onSchemaLoad, toggleDocs }) => {
99
const url = item.draft ? get(item, 'draft.request.url', '') : get(item, 'request.url', '');
10+
const pathname = item.draft ? get(item, 'draft.pathname', '') : get(item, 'pathname', '');
11+
const uid = item.draft ? get(item, 'draft.uid', '') : get(item, 'uid', '');
1012
const environment = findEnvironmentInCollection(collection, collection.activeEnvironmentUid);
11-
const request = item.draft ? item.draft.request : item.request;
13+
const request = item.draft ? { ...item.draft.request, pathname, uid } : { ...item.request, pathname, uid };
1214

1315
let {
1416
schema,

packages/bruno-electron/src/ipc/network/index.js

Lines changed: 76 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const contentDispositionParser = require('content-disposition');
99
const mime = require('mime-types');
1010
const FormData = require('form-data');
1111
const { ipcMain } = require('electron');
12-
const { each, get, extend, cloneDeep } = require('lodash');
12+
const { each, get, extend, cloneDeep, merge } = require('lodash');
1313
const { NtlmClient } = require('axios-ntlm');
1414
const { VarsRuntime, AssertRuntime, ScriptRuntime, TestRuntime } = require('@usebruno/js');
1515
const { interpolateString } = require('./interpolate-string');
@@ -24,7 +24,7 @@ const { uuid, safeStringifyJSON, safeParseJSON, parseDataFromResponse, parseData
2424
const { chooseFileToSave, writeBinaryFile, writeFile } = require('../../utils/filesystem');
2525
const { addCookieToJar, getDomainsWithCookies, getCookieStringForUrl } = require('../../utils/cookies');
2626
const { createFormData } = require('../../utils/form-data');
27-
const { findItemInCollectionByPathname, sortFolder, getAllRequestsInFolderRecursively, getEnvVars } = require('../../utils/collection');
27+
const { findItemInCollectionByPathname, sortFolder, getAllRequestsInFolderRecursively, getEnvVars, getTreePathFromCollectionToItem, mergeVars } = require('../../utils/collection');
2828
const { getOAuth2TokenUsingAuthorizationCode, getOAuth2TokenUsingClientCredentials, getOAuth2TokenUsingPasswordCredentials } = require('../../utils/oauth2');
2929
const { preferencesUtil } = require('../../store/preferences');
3030
const { getProcessEnvVars } = require('../../store/process-env');
@@ -317,6 +317,77 @@ const configureRequest = async (
317317
return axiosInstance;
318318
};
319319

320+
const fetchGqlSchemaHandler = async (event, endpoint, environment, _request, collection) => {
321+
try {
322+
const requestTreePath = getTreePathFromCollectionToItem(collection, _request);
323+
// Create a clone of the request to avoid mutating the original
324+
const resolvedRequest = cloneDeep(_request);
325+
// mergeVars modifies the request in place, but we'll assign it to ensure consistency
326+
mergeVars(collection, resolvedRequest, requestTreePath);
327+
const envVars = getEnvVars(environment);
328+
329+
const globalEnvironmentVars = collection.globalEnvironmentVariables;
330+
const folderVars = resolvedRequest.folderVariables;
331+
const requestVariables = resolvedRequest.requestVariables;
332+
const collectionVariables = resolvedRequest.collectionVariables;
333+
const runtimeVars = collection.runtimeVariables;
334+
335+
// Precedence: runtimeVars > requestVariables > folderVars > envVars > collectionVariables > globalEnvironmentVars
336+
const resolvedVars = merge(
337+
{},
338+
globalEnvironmentVars,
339+
collectionVariables,
340+
envVars,
341+
folderVars,
342+
requestVariables,
343+
runtimeVars
344+
);
345+
346+
const collectionRoot = get(collection, 'root', {});
347+
const request = prepareGqlIntrospectionRequest(endpoint, resolvedVars, _request, collectionRoot);
348+
349+
request.timeout = preferencesUtil.getRequestTimeout();
350+
351+
if (!preferencesUtil.shouldVerifyTls()) {
352+
request.httpsAgent = new https.Agent({
353+
rejectUnauthorized: false
354+
});
355+
}
356+
357+
const collectionPath = collection.pathname;
358+
const processEnvVars = getProcessEnvVars(collection.uid);
359+
360+
const axiosInstance = await configureRequest(
361+
collection.uid,
362+
request,
363+
envVars,
364+
collection.runtimeVariables,
365+
processEnvVars,
366+
collectionPath
367+
);
368+
369+
const response = await axiosInstance(request);
370+
371+
return {
372+
status: response.status,
373+
statusText: response.statusText,
374+
headers: response.headers,
375+
data: response.data
376+
};
377+
} catch (error) {
378+
if (error.response) {
379+
return {
380+
status: error.response.status,
381+
statusText: error.response.statusText,
382+
headers: error.response.headers,
383+
data: error.response.data
384+
};
385+
}
386+
387+
return Promise.reject(error);
388+
}
389+
};
390+
320391
const registerNetworkIpc = (mainWindow) => {
321392
const onConsoleLog = (type, args) => {
322393
console[type](...args);
@@ -804,84 +875,8 @@ const registerNetworkIpc = (mainWindow) => {
804875
});
805876
});
806877

807-
ipcMain.handle('fetch-gql-schema', async (event, endpoint, environment, _request, collection) => {
808-
try {
809-
const envVars = getEnvVars(environment);
810-
const collectionRoot = get(collection, 'root', {});
811-
const request = prepareGqlIntrospectionRequest(endpoint, envVars, _request, collectionRoot);
812-
813-
request.timeout = preferencesUtil.getRequestTimeout();
814-
815-
if (!preferencesUtil.shouldVerifyTls()) {
816-
request.httpsAgent = new https.Agent({
817-
rejectUnauthorized: false
818-
});
819-
}
820-
821-
const requestUid = uuid();
822-
const collectionPath = collection.pathname;
823-
const collectionUid = collection.uid;
824-
const runtimeVariables = collection.runtimeVariables;
825-
const processEnvVars = getProcessEnvVars(collectionUid);
826-
const brunoConfig = getBrunoConfig(collection.uid);
827-
const scriptingConfig = get(brunoConfig, 'scripts', {});
828-
scriptingConfig.runtime = getJsSandboxRuntime(collection);
829-
830-
await runPreRequest(
831-
request,
832-
requestUid,
833-
envVars,
834-
collectionPath,
835-
collection,
836-
collectionUid,
837-
runtimeVariables,
838-
processEnvVars,
839-
scriptingConfig
840-
);
841-
842-
interpolateVars(request, envVars, collection.runtimeVariables, processEnvVars);
843-
const axiosInstance = await configureRequest(
844-
collection.uid,
845-
request,
846-
envVars,
847-
collection.runtimeVariables,
848-
processEnvVars,
849-
collectionPath
850-
);
851-
const response = await axiosInstance(request);
852-
853-
await runPostResponse(
854-
request,
855-
response,
856-
requestUid,
857-
envVars,
858-
collectionPath,
859-
collection,
860-
collectionUid,
861-
runtimeVariables,
862-
processEnvVars,
863-
scriptingConfig
864-
);
865-
866-
return {
867-
status: response.status,
868-
statusText: response.statusText,
869-
headers: response.headers,
870-
data: response.data
871-
};
872-
} catch (error) {
873-
if (error.response) {
874-
return {
875-
status: error.response.status,
876-
statusText: error.response.statusText,
877-
headers: error.response.headers,
878-
data: error.response.data
879-
};
880-
}
881-
882-
return Promise.reject(error);
883-
}
884-
});
878+
// handler for fetch-gql-schema
879+
ipcMain.handle('fetch-gql-schema', fetchGqlSchemaHandler)
885880

886881
ipcMain.handle(
887882
'renderer:run-collection-folder',
@@ -1342,3 +1337,4 @@ const registerNetworkIpc = (mainWindow) => {
13421337
module.exports = registerNetworkIpc;
13431338
module.exports.configureRequest = configureRequest;
13441339
module.exports.getCertsAndProxyConfig = getCertsAndProxyConfig;
1340+
module.exports.fetchGqlSchemaHandler = fetchGqlSchemaHandler;

packages/bruno-electron/src/ipc/network/prepare-gql-introspection-request.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ const { interpolate } = require('@usebruno/common');
33
const { getIntrospectionQuery } = require('graphql');
44
const { setAuthHeaders } = require('./prepare-request');
55

6-
const prepareGqlIntrospectionRequest = (endpoint, envVars, request, collectionRoot) => {
6+
const prepareGqlIntrospectionRequest = (endpoint, resolvedVars, request, collectionRoot) => {
77
if (endpoint && endpoint.length) {
8-
endpoint = interpolate(endpoint, envVars);
8+
endpoint = interpolate(endpoint, resolvedVars);
99
}
1010

1111
const queryParams = {
@@ -16,7 +16,7 @@ const prepareGqlIntrospectionRequest = (endpoint, envVars, request, collectionRo
1616
method: 'POST',
1717
url: endpoint,
1818
headers: {
19-
...mapHeaders(request.headers, get(collectionRoot, 'request.headers', [])),
19+
...mapHeaders(request.headers, get(collectionRoot, 'request.headers', []), resolvedVars),
2020
Accept: 'application/json',
2121
'Content-Type': 'application/json'
2222
},
@@ -26,19 +26,20 @@ const prepareGqlIntrospectionRequest = (endpoint, envVars, request, collectionRo
2626
return setAuthHeaders(axiosRequest, request, collectionRoot);
2727
};
2828

29-
const mapHeaders = (requestHeaders, collectionHeaders) => {
29+
const mapHeaders = (requestHeaders, collectionHeaders, resolvedVars) => {
3030
const headers = {};
3131

32-
each(requestHeaders, (h) => {
32+
// Add collection headers first
33+
each(collectionHeaders, (h) => {
3334
if (h.enabled) {
34-
headers[h.name] = h.value;
35+
headers[h.name] = interpolate(h.value, resolvedVars);
3536
}
3637
});
3738

38-
// collection headers
39-
each(collectionHeaders, (h) => {
39+
// Then add request headers, which will overwrite if names overlap
40+
each(requestHeaders, (h) => {
4041
if (h.enabled) {
41-
headers[h.name] = h.value;
42+
headers[h.name] = interpolate(h.value, resolvedVars);
4243
}
4344
});
4445

0 commit comments

Comments
 (0)