Skip to content

Commit

Permalink
bugfix(#1320):Now the form-url-encoded params in the body can contain…
Browse files Browse the repository at this point in the history
… multiple values with same name. (#2964)

* Now the form-url-encoded params in the body can contain multiple values with same name.

* Updated the tests and renamed the function name

* Added the inimported function

* Minor changes.
  • Loading branch information
sanjai0py authored Sep 15, 2024
1 parent 8856e8e commit 0937bab
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 7 deletions.
12 changes: 7 additions & 5 deletions packages/bruno-electron/src/ipc/network/prepare-request.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const FormData = require('form-data');
const fs = require('fs');
const path = require('path');
const { getTreePathFromCollectionToItem } = require('../../utils/collection');
const { buildFormUrlEncodedPayload } = require('../../utils/common');

const mergeFolderLevelHeaders = (request, requestTreePath) => {
let folderHeaders = new Map();
Expand Down Expand Up @@ -300,7 +301,7 @@ const prepareRequest = (item, collection) => {
let contentTypeDefined = false;
let url = request.url;

// collection headers
// Collection level headers
each(get(collectionRoot, 'request.headers', []), (h) => {
if (h.enabled && h.name.length > 0) {
headers[h.name] = h.value;
Expand All @@ -319,6 +320,7 @@ const prepareRequest = (item, collection) => {
mergeVars(collection, request, requestTreePath);
}

// Request level headers
each(request.headers, (h) => {
if (h.enabled && h.name.length > 0) {
headers[h.name] = h.value;
Expand Down Expand Up @@ -372,11 +374,11 @@ const prepareRequest = (item, collection) => {
}

if (request.body.mode === 'formUrlEncoded') {
axiosRequest.headers['content-type'] = 'application/x-www-form-urlencoded';
const params = {};
if (!contentTypeDefined) {
axiosRequest.headers['content-type'] = 'application/x-www-form-urlencoded';
}
const enabledParams = filter(request.body.formUrlEncoded, (p) => p.enabled);
each(enabledParams, (p) => (params[p.name] = p.value));
axiosRequest.data = params;
axiosRequest.data = buildFormUrlEncodedPayload(enabledParams);
}

if (request.body.mode === 'multipartForm') {
Expand Down
21 changes: 20 additions & 1 deletion packages/bruno-electron/src/utils/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,24 @@ const flattenDataForDotNotation = (data) => {
return result;
};

/**
* @param {Array.<object>} params The request body Array
* @returns {object} Returns an obj with repeating key as a array of values
* {item: 2, item: 3, item1: 4} becomes {item: [2,3], item1: 4}
*/
const buildFormUrlEncodedPayload = (params) => {
return params.reduce((acc, p) => {
if (!acc[p.name]) {
acc[p.name] = p.value;
} else if (Array.isArray(acc[p.name])) {
acc[p.name].push(p.value);
} else {
acc[p.name] = [acc[p.name], p.value];
}
return acc;
}, {});
};

module.exports = {
uuid,
stringifyJson,
Expand All @@ -93,5 +111,6 @@ module.exports = {
safeParseJSON,
simpleHash,
generateUidBasedOnHash,
flattenDataForDotNotation
flattenDataForDotNotation,
buildFormUrlEncodedPayload
};
41 changes: 40 additions & 1 deletion packages/bruno-electron/tests/network/prepare-request.spec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const { describe, it, expect } = require('@jest/globals');

const prepareRequest = require('../../src/ipc/network/prepare-request');
const { buildFormUrlEncodedPayload } = require('../../src/utils/common');

describe('prepare-request: prepareRequest', () => {
describe('Decomments request body', () => {
Expand All @@ -17,5 +18,43 @@ describe('prepare-request: prepareRequest', () => {
const result = prepareRequest({ request: { body } }, {});
expect(result.data).toEqual(expected);
});

it('should handle single key-value pair', () => {
const requestObj = [{ name: 'item', value: 2 }];
const expected = { item: 2 };
const result = buildFormUrlEncodedPayload(requestObj);
expect(result).toEqual(expected);
});

it('should handle multiple key-value pairs with unique keys', () => {
const requestObj = [
{ name: 'item1', value: 2 },
{ name: 'item2', value: 3 }
];
const expected = { item1: 2, item2: 3 };
const result = buildFormUrlEncodedPayload(requestObj);
expect(result).toEqual(expected);
});

it('should handle multiple key-value pairs with the same key', () => {
const requestObj = [
{ name: 'item', value: 2 },
{ name: 'item', value: 3 }
];
const expected = { item: [2, 3] };
const result = buildFormUrlEncodedPayload(requestObj);
expect(result).toEqual(expected);
});

it('should handle mixed key-value pairs with unique and duplicate keys', () => {
const requestObj = [
{ name: 'item1', value: 2 },
{ name: 'item2', value: 3 },
{ name: 'item1', value: 4 }
];
const expected = { item1: [2, 4], item2: 3 };
const result = buildFormUrlEncodedPayload(requestObj);
expect(result).toEqual(expected);
});
});
});
});

0 comments on commit 0937bab

Please sign in to comment.