Skip to content

Commit

Permalink
fixup: handle incorrect content type
Browse files Browse the repository at this point in the history
  • Loading branch information
Will Toozs committed Jul 9, 2024
1 parent dbf89e1 commit e655b35
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 1 deletion.
8 changes: 7 additions & 1 deletion lib/api/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,13 @@ const api = {
let fileEventData = null;

if (apiMethod === 'objectPost') {
formDataParser = busboy({ headers: request.headers });
if (request.headers['content-type'].includes('multipart/form-data')) {
formDataParser = busboy({ headers: request.headers });
} else {
const contentTypeError = errors.PreconditionFailed
.customizeDescription('Bucket POST must be of the enclosure-type multipart/form-data');
return process.nextTick(callback, contentTypeError);
}
}

return async.waterfall([
Expand Down
98 changes: 98 additions & 0 deletions tests/functional/aws-node-sdk/test/object/post.js
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,104 @@ describe('POST object', () => {
});
});

it('should handle error when content-type is incorrect', done => {
const { bucketName, url } = testContext;
// Prep fields then remove the key field
let fields = calculateFields(ak, sk, bucketName);
fields = fields.filter(e => e.name !== 'key');

const formData = new FormData();

fields.forEach(field => {
formData.append(field.name, field.value);
});

formData.append('file', fs.createReadStream(path.join(__dirname, filename)));

formData.getLength((err, length) => {
if (err) {
return done(err);
}

const headers = {
...formData.getHeaders(),
'Content-Length': length,
};
headers['content-type'] = 'application/json';
return axios.post(url, formData, {
headers,
})
.then(() => {
done(new Error('Request should not succeed wrong content-type'));
})
.catch(err => {
assert.ok(err.response, 'Error should be returned by axios');

// Parse the XML error response
xml2js.parseString(err.response.data, (err, result) => {
if (err) {
return done(err);
}

const error = result.Error;
assert.equal(error.Code[0], 'PreconditionFailed');
assert.equal(error.Message[0],
'Bucket POST must be of the enclosure-type multipart/form-data');
return done();
});
});
});
});

it('should handle error when content-type is missing', done => {
const { bucketName, url } = testContext;
// Prep fields then remove the key field
let fields = calculateFields(ak, sk, bucketName);
fields = fields.filter(e => e.name !== 'key');

const formData = new FormData();

fields.forEach(field => {
formData.append(field.name, field.value);
});

formData.append('file', fs.createReadStream(path.join(__dirname, filename)));

formData.getLength((err, length) => {
if (err) {
return done(err);
}

const headers = {
...formData.getHeaders(),
'Content-Length': length,
};
delete headers['content-type'];
return axios.post(url, formData, {
headers,
})
.then(() => {
done(new Error('Request should not succeed without correct content-type'));
})
.catch(err => {
assert.ok(err.response, 'Error should be returned by axios');

// Parse the XML error response
xml2js.parseString(err.response.data, (err, result) => {
if (err) {
return done(err);
}

const error = result.Error;
assert.equal(error.Code[0], 'PreconditionFailed');
assert.equal(error.Message[0],
'Bucket POST must be of the enclosure-type multipart/form-data');
return done();
});
});
});
});

it('should upload an object with key slash', done => {
const { bucketName, url } = testContext;
const slashKey = '/';
Expand Down

0 comments on commit e655b35

Please sign in to comment.