Skip to content

Commit 7033c44

Browse files
author
Will Toozs
committed
fixup: handle incorrect content type
1 parent d3b76f0 commit 7033c44

File tree

2 files changed

+105
-1
lines changed

2 files changed

+105
-1
lines changed

lib/api/api.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,13 @@ const api = {
190190
let fileEventData = null;
191191

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

196202
return async.waterfall([

tests/functional/aws-node-sdk/test/object/post.js

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,104 @@ describe('POST object', () => {
436436
});
437437
});
438438

439+
it('should handle error when content-type is incorrect', done => {
440+
const { bucketName, url } = testContext;
441+
// Prep fields then remove the key field
442+
let fields = calculateFields(ak, sk, bucketName);
443+
fields = fields.filter(e => e.name !== 'key');
444+
445+
const formData = new FormData();
446+
447+
fields.forEach(field => {
448+
formData.append(field.name, field.value);
449+
});
450+
451+
formData.append('file', fs.createReadStream(path.join(__dirname, filename)));
452+
453+
formData.getLength((err, length) => {
454+
if (err) {
455+
return done(err);
456+
}
457+
458+
const headers = {
459+
...formData.getHeaders(),
460+
'Content-Length': length,
461+
};
462+
headers['content-type'] = 'application/json';
463+
return axios.post(url, formData, {
464+
headers,
465+
})
466+
.then(() => {
467+
done(new Error('Request should not succeed wrong content-type'));
468+
})
469+
.catch(err => {
470+
assert.ok(err.response, 'Error should be returned by axios');
471+
472+
// Parse the XML error response
473+
xml2js.parseString(err.response.data, (err, result) => {
474+
if (err) {
475+
return done(err);
476+
}
477+
478+
const error = result.Error;
479+
assert.equal(error.Code[0], 'PreconditionFailed');
480+
assert.equal(error.Message[0],
481+
'Bucket POST must be of the enclosure-type multipart/form-data');
482+
return done();
483+
});
484+
});
485+
});
486+
});
487+
488+
it('should handle error when content-type is missing', done => {
489+
const { bucketName, url } = testContext;
490+
// Prep fields then remove the key field
491+
let fields = calculateFields(ak, sk, bucketName);
492+
fields = fields.filter(e => e.name !== 'key');
493+
494+
const formData = new FormData();
495+
496+
fields.forEach(field => {
497+
formData.append(field.name, field.value);
498+
});
499+
500+
formData.append('file', fs.createReadStream(path.join(__dirname, filename)));
501+
502+
formData.getLength((err, length) => {
503+
if (err) {
504+
return done(err);
505+
}
506+
507+
const headers = {
508+
...formData.getHeaders(),
509+
'Content-Length': length,
510+
};
511+
delete headers['content-type'];
512+
return axios.post(url, formData, {
513+
headers,
514+
})
515+
.then(() => {
516+
done(new Error('Request should not succeed without correct content-type'));
517+
})
518+
.catch(err => {
519+
assert.ok(err.response, 'Error should be returned by axios');
520+
521+
// Parse the XML error response
522+
xml2js.parseString(err.response.data, (err, result) => {
523+
if (err) {
524+
return done(err);
525+
}
526+
527+
const error = result.Error;
528+
assert.equal(error.Code[0], 'PreconditionFailed');
529+
assert.equal(error.Message[0],
530+
'Bucket POST must be of the enclosure-type multipart/form-data');
531+
return done();
532+
});
533+
});
534+
});
535+
});
536+
439537
it('should upload an object with key slash', done => {
440538
const { bucketName, url } = testContext;
441539
const slashKey = '/';

0 commit comments

Comments
 (0)