Skip to content

Commit

Permalink
Fix: Allow empty Content-Type when no body #1693
Browse files Browse the repository at this point in the history
By default Axios will set the Content-Type for POST/PUT/PATCH requests
to "application/x-www-form-urlencoded" if the Content-Type header is not
specified.

This explicitly sets the content type to "false" when there the body
mode is set to "none", and the user has not set an explicit content type
themselves. Setting the content type to false directs Axios not to send
a Content-Type header.
  • Loading branch information
betawait committed Feb 9, 2025
1 parent 667b153 commit 44927fa
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 29 deletions.
60 changes: 31 additions & 29 deletions packages/bruno-electron/src/ipc/network/interpolate-vars.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,37 +65,39 @@ const interpolateVars = (request, envVariables = {}, runtimeVariables = {}, proc

const contentType = getContentType(request.headers);

if (contentType.includes('json')) {
if (typeof request.data === 'string') {
if (request.data.length) {
request.data = _interpolate(request.data);
if (typeof contentType === 'string') {
if (contentType.includes('json')) {
if (typeof request.data === 'string') {
if (request.data.length) {
request.data = _interpolate(request.data);
}
} else if (typeof request.data === 'object') {
try {
let parsed = JSON.stringify(request.data);
parsed = _interpolate(parsed);
request.data = JSON.parse(parsed);
} catch (err) {}
}
} else if (typeof request.data === 'object') {
try {
let parsed = JSON.stringify(request.data);
parsed = _interpolate(parsed);
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 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 {
request.data = _interpolate(request.data);
}

each(request.pathParams, (param) => {
Expand Down
7 changes: 7 additions & 0 deletions packages/bruno-electron/src/ipc/network/prepare-request.js
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
});
});
18 changes: 18 additions & 0 deletions packages/bruno-electron/tests/network/prepare-request.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
});
});
});

0 comments on commit 44927fa

Please sign in to comment.