mirror of
https://github.com/usebruno/bruno.git
synced 2024-11-21 23:43:15 +01:00
bugfix(#1320):Now the form-url-encoded params in the body can contain 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.
This commit is contained in:
parent
8856e8ec71
commit
0937bab7f5
@ -5,6 +5,7 @@ const FormData = require('form-data');
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const { getTreePathFromCollectionToItem } = require('../../utils/collection');
|
const { getTreePathFromCollectionToItem } = require('../../utils/collection');
|
||||||
|
const { buildFormUrlEncodedPayload } = require('../../utils/common');
|
||||||
|
|
||||||
const mergeFolderLevelHeaders = (request, requestTreePath) => {
|
const mergeFolderLevelHeaders = (request, requestTreePath) => {
|
||||||
let folderHeaders = new Map();
|
let folderHeaders = new Map();
|
||||||
@ -300,7 +301,7 @@ const prepareRequest = (item, collection) => {
|
|||||||
let contentTypeDefined = false;
|
let contentTypeDefined = false;
|
||||||
let url = request.url;
|
let url = request.url;
|
||||||
|
|
||||||
// collection headers
|
// Collection level headers
|
||||||
each(get(collectionRoot, 'request.headers', []), (h) => {
|
each(get(collectionRoot, 'request.headers', []), (h) => {
|
||||||
if (h.enabled && h.name.length > 0) {
|
if (h.enabled && h.name.length > 0) {
|
||||||
headers[h.name] = h.value;
|
headers[h.name] = h.value;
|
||||||
@ -319,6 +320,7 @@ const prepareRequest = (item, collection) => {
|
|||||||
mergeVars(collection, request, requestTreePath);
|
mergeVars(collection, request, requestTreePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Request level headers
|
||||||
each(request.headers, (h) => {
|
each(request.headers, (h) => {
|
||||||
if (h.enabled && h.name.length > 0) {
|
if (h.enabled && h.name.length > 0) {
|
||||||
headers[h.name] = h.value;
|
headers[h.name] = h.value;
|
||||||
@ -372,11 +374,11 @@ const prepareRequest = (item, collection) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (request.body.mode === 'formUrlEncoded') {
|
if (request.body.mode === 'formUrlEncoded') {
|
||||||
axiosRequest.headers['content-type'] = 'application/x-www-form-urlencoded';
|
if (!contentTypeDefined) {
|
||||||
const params = {};
|
axiosRequest.headers['content-type'] = 'application/x-www-form-urlencoded';
|
||||||
|
}
|
||||||
const enabledParams = filter(request.body.formUrlEncoded, (p) => p.enabled);
|
const enabledParams = filter(request.body.formUrlEncoded, (p) => p.enabled);
|
||||||
each(enabledParams, (p) => (params[p.name] = p.value));
|
axiosRequest.data = buildFormUrlEncodedPayload(enabledParams);
|
||||||
axiosRequest.data = params;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.body.mode === 'multipartForm') {
|
if (request.body.mode === 'multipartForm') {
|
||||||
|
@ -85,6 +85,24 @@ const flattenDataForDotNotation = (data) => {
|
|||||||
return result;
|
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 = {
|
module.exports = {
|
||||||
uuid,
|
uuid,
|
||||||
stringifyJson,
|
stringifyJson,
|
||||||
@ -93,5 +111,6 @@ module.exports = {
|
|||||||
safeParseJSON,
|
safeParseJSON,
|
||||||
simpleHash,
|
simpleHash,
|
||||||
generateUidBasedOnHash,
|
generateUidBasedOnHash,
|
||||||
flattenDataForDotNotation
|
flattenDataForDotNotation,
|
||||||
|
buildFormUrlEncodedPayload
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
const { describe, it, expect } = require('@jest/globals');
|
const { describe, it, expect } = require('@jest/globals');
|
||||||
|
|
||||||
const prepareRequest = require('../../src/ipc/network/prepare-request');
|
const prepareRequest = require('../../src/ipc/network/prepare-request');
|
||||||
|
const { buildFormUrlEncodedPayload } = require('../../src/utils/common');
|
||||||
|
|
||||||
describe('prepare-request: prepareRequest', () => {
|
describe('prepare-request: prepareRequest', () => {
|
||||||
describe('Decomments request body', () => {
|
describe('Decomments request body', () => {
|
||||||
@ -17,5 +18,43 @@ describe('prepare-request: prepareRequest', () => {
|
|||||||
const result = prepareRequest({ request: { body } }, {});
|
const result = prepareRequest({ request: { body } }, {});
|
||||||
expect(result.data).toEqual(expected);
|
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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
Loading…
Reference in New Issue
Block a user