mirror of
https://github.com/usebruno/bruno.git
synced 2026-06-15 20:01:28 +00:00
Merge pull request #3973 from betawait/bugfix/bug-remove-content-type-in-post-with-no-body
Fix: Allow empty Content-Type when no body (#1693)
This commit is contained in:
@@ -69,45 +69,47 @@ const interpolateVars = (request, envVariables = {}, runtimeVariables = {}, proc
|
||||
|
||||
const contentType = getContentType(request.headers);
|
||||
|
||||
/*
|
||||
We explicitly avoid interpolating buffer values because the file content is read as a buffer object in raw body mode.
|
||||
Even if the selected file's content type is JSON, this prevents the buffer object from being interpolated.
|
||||
*/
|
||||
if (contentType.includes('json') && !Buffer.isBuffer(request.data)) {
|
||||
if (typeof request.data === 'string') {
|
||||
if (request.data.length) {
|
||||
request.data = _interpolate(request.data, {
|
||||
if (typeof contentType === 'string') {
|
||||
/*
|
||||
We explicitly avoid interpolating buffer values because the file content is read as a buffer object in raw body mode.
|
||||
Even if the selected file's content type is JSON, this prevents the buffer object from being interpolated.
|
||||
*/
|
||||
if (contentType.includes('json') && !Buffer.isBuffer(request.data)) {
|
||||
if (typeof request.data === 'string') {
|
||||
if (request.data.length) {
|
||||
request.data = _interpolate(request.data, {
|
||||
escapeJSONStrings: true
|
||||
});
|
||||
}
|
||||
} else if (typeof request.data === 'object') {
|
||||
try {
|
||||
const jsonDoc = JSON.stringify(request.data);
|
||||
const parsed = _interpolate(jsonDoc, {
|
||||
escapeJSONStrings: true
|
||||
});
|
||||
request.data = JSON.parse(parsed);
|
||||
} catch (err) {}
|
||||
}
|
||||
} else if (typeof request.data === 'object') {
|
||||
try {
|
||||
const jsonDoc = JSON.stringify(request.data);
|
||||
const parsed = _interpolate(jsonDoc, {
|
||||
escapeJSONStrings: true
|
||||
});
|
||||
request.data = JSON.parse(parsed);
|
||||
} catch (err) {}
|
||||
} else if (contentType === 'application/x-www-form-urlencoded') {
|
||||
if (typeof request.data === 'object') {
|
||||
try {
|
||||
forOwn(request?.data, (value, key) => {
|
||||
request.data[key] = _interpolate(value);
|
||||
});
|
||||
} catch (err) {}
|
||||
}
|
||||
} else if (contentType === 'multipart/form-data') {
|
||||
if (Array.isArray(request?.data) && !(request.data instanceof FormData)) {
|
||||
try {
|
||||
request.data = request?.data?.map(d => ({
|
||||
...d,
|
||||
value: _interpolate(d?.value)
|
||||
}));
|
||||
} catch (err) {}
|
||||
}
|
||||
} else {
|
||||
request.data = _interpolate(request.data);
|
||||
}
|
||||
} else if (contentType === 'application/x-www-form-urlencoded') {
|
||||
if (typeof request.data === 'object') {
|
||||
try {
|
||||
forOwn(request?.data, (value, key) => {
|
||||
request.data[key] = _interpolate(value);
|
||||
});
|
||||
} catch (err) {}
|
||||
}
|
||||
} else if (contentType === 'multipart/form-data') {
|
||||
if (Array.isArray(request?.data) && !(request.data instanceof FormData)) {
|
||||
try {
|
||||
request.data = request?.data?.map(d => ({
|
||||
...d,
|
||||
value: _interpolate(d?.value)
|
||||
}));
|
||||
} catch (err) {}
|
||||
}
|
||||
} else {
|
||||
request.data = _interpolate(request.data);
|
||||
}
|
||||
|
||||
each(request.pathParams, (param) => {
|
||||
|
||||
@@ -393,6 +393,13 @@ const prepareRequest = async (item, collection = {}, abortController) => {
|
||||
axiosRequest.data = graphqlQuery;
|
||||
}
|
||||
|
||||
// if the mode is 'none' then set the content-type header to false. #1693
|
||||
if (request.body.mode === 'none') {
|
||||
if(!contentTypeDefined) {
|
||||
axiosRequest.headers['content-type'] = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (request.script) {
|
||||
axiosRequest.script = request.script;
|
||||
}
|
||||
|
||||
@@ -100,4 +100,13 @@ describe('interpolate-vars: interpolateVars', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('Handles content-type header set to false', () => {
|
||||
it('Should result empty data', async () => {
|
||||
const request = { method: 'POST', url: 'test', data: undefined, headers: { 'content-type': false } };
|
||||
|
||||
const result = interpolateVars(request, { 'test.url': 'test.com' }, null, null);
|
||||
expect(result.data).toEqual(undefined);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -59,4 +59,22 @@ describe('prepare-request: prepareRequest', () => {
|
||||
expect(result).toEqual(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe.each(['POST', 'PUT', 'PATCH'])('POST request with no body', (method) => {
|
||||
it('Should set content-type header to false if method is ' + method + ' and there is no data in the body', async () => {
|
||||
const request = { method: method, url: 'test-domain', body: { mode: 'none' } };
|
||||
const result = await prepareRequest({ request, collection: { pathname: '' } });
|
||||
expect(result.headers['content-type']).toEqual(false);
|
||||
});
|
||||
it('Should respect the content-type header if explicitly set', async () => {
|
||||
const request = {
|
||||
method: method,
|
||||
url: 'test-domain',
|
||||
body: { mode: 'none' },
|
||||
headers: [{ name: 'content-type', value: 'application/json', enabled: true }]
|
||||
};
|
||||
const result = await prepareRequest({ request, collection: { pathname: '' } });
|
||||
expect(result.headers['content-type']).toEqual('application/json');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user