diff --git a/lib/tools/weightChecker/contentTypeChecker.js b/lib/tools/weightChecker/contentTypeChecker.js new file mode 100644 index 0000000..d5fa7ce --- /dev/null +++ b/lib/tools/weightChecker/contentTypeChecker.js @@ -0,0 +1,188 @@ +var debug = require('debug')('ylt:contentTypeChecker'); +var Q = require('q'); +var isJpg = require('is-jpg'); +var isPng = require('is-png'); +var isSvg = require('is-svg'); +var isGif = require('is-gif'); +var isWoff = require('is-woff'); +var isWoff2 = require('is-woff2'); +var isOtf = require('is-otf'); +var isTtf = require('is-ttf'); +var isEot = require('is-eot'); + +var ContentTypeChecker = function() { + + function checkContentType(entry) { + var deferred = Q.defer(); + + debug('Entering contentTypeChecker'); + + // Ignore very small files as they are generally tracking pixels + if (entry.weightCheck && entry.weightCheck.body && entry.weightCheck.bodySize > 100) { + var foundType; + + try { + foundType = findContentType(entry.weightCheck.body); + + if (!entry.contentType || entry.contentType === '') { + if (foundType === null) { + debug('ContentType is empty for file %s', entry.url); + } else { + debug('ContentType is empty for file %s. It should be %s.', entry.url, foundType.mimes[0]); + entry.oldContentType = null; + rewriteContentType(entry, foundType); + } + } else { + if (foundType !== null && foundType.mimes.indexOf(entry.contentType) === -1) { + debug('ContentType %s is wrong for %s. It should be %s.', entry.contentType, entry.url, foundType.mimes[0]); + entry.oldContentType = entry.contentType; + rewriteContentType(entry, foundType); + } + } + + } catch(err) { + debug('Error while analyzing the contentType of %s', entry.url); + debug(err); + } + } + + deferred.resolve(entry); + + return deferred.promise; + } + + function findContentType(body) { + var buffer = new Buffer(body, 'binary'); + + if (isJpg(buffer)) { + return contentTypes.jpeg; + } + + if (isPng(buffer)) { + return contentTypes.png; + } + + // https://github.com/sindresorhus/is-svg/issues/7 + if (/