fix(upload): add gm image identification

Fixes #96
This commit is contained in:
vladikoff 2015-11-13 17:46:07 -05:00 коммит произвёл Vlad Filippov
Родитель 7b1d06caa8
Коммит 55b0744e68
3 изменённых файлов: 54 добавлений и 8 удалений

Просмотреть файл

@ -23,15 +23,23 @@ function processImage(src, width, height) {
// The '>' modifier does this.
// See more: http://www.graphicsmagick.org/GraphicsMagick.html
limit(gm(src)
.resize(width, height, '>'))
.noProfile()
.toBuffer('png', function(err, buf) {
.identify(function (err) {
if (err) {
reject(err);
} else {
resolve(buf);
// if gm cannot identify this image, then reject
return reject (err);
}
});
limit(gm(src).resize(width, height, '>')
.noProfile()
.toBuffer('png', function(err, buf) {
if (err) {
reject(err);
} else {
resolve(buf);
}
}));
})
);
});
}

Просмотреть файл

@ -30,13 +30,17 @@ exports.upload = function upload(id, payload, headers) {
};
logger.verbose('upload', url);
payload.pipe(request.post(url, opts, function(err, res, body) {
var nestedError = null;
if (body && body[0] && body[0].error) {
nestedError = body[0].error;
}
if (err) {
logger.error('upload.network.error', err);
reject(AppError.processingError(err));
return;
}
if (res.statusCode >= 400 || body.error) {
if (res.statusCode >= 400 || body.error || nestedError) {
logger.error('upload.worker.error', body);
reject(AppError.processingError(body));
return;

Просмотреть файл

@ -480,6 +480,40 @@ describe('/avatar', function() {
});
});
it('should fail with an error if image cannot be identified', function() {
this.slow(2000);
this.timeout(3000);
var dataLength = 2;
mock.token({
user: USERID,
email: 'user@example.domain',
scope: ['profile:avatar:write']
});
mock.log('img_workers', function(rec) {
if (rec.levelname === 'ERROR') {
return true;
}
});
mock.log('server', function(rec) {
if (rec.levelname === 'ERROR') {
return true;
}
});
return Server.api.post({
url: '/avatar/upload',
payload: Buffer('{}'),
headers: { authorization: 'Bearer ' + tok,
'content-type': 'image/png',
'content-length': dataLength
}
}).then(function(res) {
assert.equal(res.statusCode, 500);
assert.equal(res.result.message, 'Image processing error');
});
});
it('should gracefully handle and report upload failures', function() {
mock.token({
user: USERID,