Skip to content

Commit

Permalink
fix(formdata): add hotfix to use the asynchronous API to compute the …
Browse files Browse the repository at this point in the history
…content-length header value; (#5521)
  • Loading branch information
DigitalBrainJS committed Feb 1, 2023
1 parent 08104c0 commit 96d336f
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 7 deletions.
17 changes: 12 additions & 5 deletions lib/adapters/http.js
Expand Up @@ -7,6 +7,7 @@ import buildURL from './../helpers/buildURL.js';
import {getProxyForUrl} from 'proxy-from-env';
import http from 'http';
import https from 'https';
import util from 'util';
import followRedirects from 'follow-redirects';
import zlib from 'zlib';
import {VERSION} from '../env/data.js';
Expand Down Expand Up @@ -117,7 +118,8 @@ const isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(pr

/*eslint consistent-return:0*/
export default isHttpAdapterSupported && function httpAdapter(config) {
return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) {
/*eslint no-async-promise-executor:0*/
return new Promise(async function dispatchHttpRequest(resolvePromise, rejectPromise) {
let data = config.data;
const responseType = config.responseType;
const responseEncoding = config.responseEncoding;
Expand Down Expand Up @@ -208,7 +210,7 @@ export default isHttpAdapterSupported && function httpAdapter(config) {
convertedData = convertedData.toString(responseEncoding);

if (!responseEncoding || responseEncoding === 'utf8') {
data = utils.stripBOM(convertedData);
convertedData = utils.stripBOM(convertedData);
}
} else if (responseType === 'stream') {
convertedData = stream.Readable.from(convertedData);
Expand Down Expand Up @@ -258,9 +260,14 @@ export default isHttpAdapterSupported && function httpAdapter(config) {
// support for https://www.npmjs.com/package/form-data api
} else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {
headers.set(data.getHeaders());
if (utils.isFunction(data.getLengthSync)) { // check if the undocumented API exists
const knownLength = data.getLengthSync();
!utils.isUndefined(knownLength) && headers.setContentLength(knownLength, false);

if (!headers.hasContentLength()) {
try {
const knownLength = await util.promisify(data.getLength).call(data);
headers.setContentLength(knownLength);
/*eslint no-empty:0*/
} catch (e) {
}
}
} else if (utils.isBlob(data)) {
data.size && headers.setContentType(data.type || 'application/octet-stream');
Expand Down
2 changes: 1 addition & 1 deletion lib/core/AxiosHeaders.js
Expand Up @@ -141,7 +141,7 @@ class AxiosHeaders {
if (header) {
const key = utils.findKey(this, header);

return !!(key && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
}

return false;
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -204,4 +204,4 @@
"@commitlint/config-conventional"
]
}
}
}
Binary file added test/unit/adapters/axios.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions test/unit/adapters/http.js
Expand Up @@ -1576,6 +1576,10 @@ describe('supports http with nodejs', function () {
it('should allow passing FormData', function (done) {
var form = new FormDataLegacy();
var file1 = Buffer.from('foo', 'utf8');
const image = path.resolve(__dirname, './axios.png');
const fileStream = fs.createReadStream(image);

const stat = fs.statSync(image);

form.append('foo', "bar");
form.append('file1', file1, {
Expand All @@ -1584,9 +1588,13 @@ describe('supports http with nodejs', function () {
contentType: 'image/jpeg'
});

form.append('fileStream', fileStream);

server = http.createServer(function (req, res) {
var receivedForm = new formidable.IncomingForm();

assert.ok(req.rawHeaders.find(header => header.toLowerCase() === 'content-length'));

receivedForm.parse(req, function (err, fields, files) {
if (err) {
return done(err);
Expand All @@ -1609,6 +1617,10 @@ describe('supports http with nodejs', function () {
assert.strictEqual(res.data.files.file1.originalFilename, 'temp/bar.jpg');
assert.strictEqual(res.data.files.file1.size, 3);

assert.strictEqual(res.data.files.fileStream.mimetype, 'image/png');
assert.strictEqual(res.data.files.fileStream.originalFilename, 'axios.png');
assert.strictEqual(res.data.files.fileStream.size, stat.size);

done();
}).catch(done);
});
Expand Down

0 comments on commit 96d336f

Please sign in to comment.