0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-10 23:36:14 -05:00

Moved isLocalFile fn to storage utils (#8985)

no issue

- moved isLocalImage fn to storage utils used the RegExp of getLocalFileStoragePath to detect also relative image paths and added tests.
- Added test for independent protocol request (skip, because not supported/implemented)
This commit is contained in:
Aileen Nowak 2017-11-09 17:11:54 +07:00 committed by Katharina Irrgang
parent 7656d0bdda
commit 6a41104969
3 changed files with 132 additions and 24 deletions

View file

@ -6,6 +6,7 @@ var globalUtils = require('../../utils');
/**
* Sanitizes a given URL or path for an image to be readable by the local file storage
* as storage needs the path without `/content/images/` prefix
* Always returns {string} url
* @param {string} imagePath
* @returns {string} imagePath
@ -13,15 +14,31 @@ var globalUtils = require('../../utils');
* for the local file storage.
*/
exports.getLocalFileStoragePath = function getLocalFileStoragePath(imagePath) {
if (imagePath.match(new RegExp('^' + globalUtils.url.urlJoin(globalUtils.url.urlFor('home', true), globalUtils.url.getSubdir(), '/', globalUtils.url.STATIC_IMAGE_URL_PREFIX)))) {
// Storage needs the path without `/content/images/` prefix
// The '/' in urlJoin is necessary to add the '/' to `content/images`, if no subdirectory is setup
return imagePath.replace(new RegExp('^' + globalUtils.url.urlJoin(globalUtils.url.urlFor('home', true), globalUtils.url.getSubdir(), '/', globalUtils.url.STATIC_IMAGE_URL_PREFIX)), '');
} else if (imagePath.match(new RegExp('^' + globalUtils.url.urlJoin(globalUtils.url.getSubdir(), '/', globalUtils.url.STATIC_IMAGE_URL_PREFIX)))) {
// Storage needs the path without `/content/images/` prefix
// The '/' in urlJoin is necessary to add the '/' to `content/images`, if no subdirectory is setup
return imagePath.replace(new RegExp('^' + globalUtils.url.urlJoin(globalUtils.url.getSubdir(), '/', globalUtils.url.STATIC_IMAGE_URL_PREFIX)), '');
// The '/' in urlJoin is necessary to add the '/' to `content/images`, if no subdirectory is setup
var urlRegExp = new RegExp('^' + globalUtils.url.urlJoin(globalUtils.url.urlFor('home', true), globalUtils.url.getSubdir(), '/', globalUtils.url.STATIC_IMAGE_URL_PREFIX)),
filePathRegExp = new RegExp('^' + globalUtils.url.urlJoin(globalUtils.url.getSubdir(), '/', globalUtils.url.STATIC_IMAGE_URL_PREFIX));
if (imagePath.match(urlRegExp)) {
return imagePath.replace(urlRegExp, '');
} else if (imagePath.match(filePathRegExp)) {
return imagePath.replace(filePathRegExp, '');
} else {
return imagePath;
}
};
/**
* @description compares the imagePath with a regex that reflects our local file storage
* @param {String} imagePath as URL or filepath
* @returns {Boolean}
*/
exports.isLocalImage = function isLocalImage(imagePath) {
var localImagePath = this.getLocalFileStoragePath(imagePath);
if (localImagePath !== imagePath) {
return true;
} else {
return false;
}
};

View file

@ -12,21 +12,6 @@ var debug = require('ghost-ignition').debug('utils:image-size'),
getImageSizeFromUrl,
getImageSizeFromFilePath;
/**
* @description compares the imagePath with a regex that reflects our local file storage
* @param {String} imagePath as URL or filepath
* @returns {Array} if match is true or null if not
*/
function isLocalImage(imagePath) {
imagePath = utils.url.urlFor('image', {image: imagePath}, true);
if (imagePath) {
return imagePath.match(new RegExp('^' + utils.url.urlJoin(utils.url.urlFor('home', true), utils.url.getSubdir(), '/', utils.url.STATIC_IMAGE_URL_PREFIX)));
} else {
return false;
}
}
/**
* @description processes the Buffer result of an image file
* @param {Object} options
@ -93,7 +78,7 @@ getImageSizeFromUrl = function getImageSizeFromUrl(imagePath) {
parsedUrl,
timeout = config.get('times:getImageSizeTimeoutInMS') || 10000;
if (isLocalImage(imagePath)) {
if (storageUtils.isLocalImage(imagePath)) {
// don't make a request for a locally stored image
return getImageSizeFromFilePath(imagePath);
}

View file

@ -34,6 +34,23 @@ describe('storage utils', function () {
result.should.be.equal('/2017/07/ghost-logo.png');
});
// Very unlikely that this is necessary, because Ghost will redirect the request beforehand.
// See https://github.com/TryGhost/Ghost/blob/master/core/server/middleware/url-redirects.js#L76
// TODO: Change the code to make this test work
it.skip('should return local file storage path for https request, when blog setup as http', function () {
var url = 'https://myblog.com/content/images/2017/07/ghost-logo.png',
result;
urlForStub = sandbox.stub(utils.url, 'urlFor');
urlForStub.withArgs('home').returns('http://myblog.com/');
urlGetSubdirStub = sandbox.stub(utils.url, 'getSubdir');
urlGetSubdirStub.returns('');
result = storageUtils.getLocalFileStoragePath(url);
should.exist(result);
result.should.be.equal('/2017/07/ghost-logo.png');
});
it('should return local file storage path for absolute URL with subdirectory', function () {
var url = 'http://myblog.com/blog/content/images/2017/07/ghost-logo.png',
result;
@ -90,4 +107,93 @@ describe('storage utils', function () {
result.should.be.equal('http://example-blog.com/ghost-logo.png');
});
});
describe('fn: isLocalImage', function () {
it('should return true when absolute URL and local file', function () {
var url = 'http://myblog.com/content/images/2017/07/ghost-logo.png',
result;
urlForStub = sandbox.stub(utils.url, 'urlFor');
urlForStub.withArgs('home').returns('http://myblog.com/');
urlGetSubdirStub = sandbox.stub(utils.url, 'getSubdir');
urlGetSubdirStub.returns('');
result = storageUtils.isLocalImage(url);
should.exist(result);
result.should.be.equal(true);
});
// Very unlikely that this is necessary, because Ghost will redirect the request beforehand.
// See https://github.com/TryGhost/Ghost/blob/master/core/server/middleware/url-redirects.js#L76
// TODO: Change the code to make this test work
it.skip('should return local file storage path for https request, when blog setup as http', function () {
var url = 'https://myblog.com/content/images/2017/07/ghost-logo.png',
result;
urlForStub = sandbox.stub(utils.url, 'urlFor');
urlForStub.withArgs('home').returns('http://myblog.com/');
urlGetSubdirStub = sandbox.stub(utils.url, 'getSubdir');
urlGetSubdirStub.returns('');
result = storageUtils.isLocalImage(url);
should.exist(result);
result.should.be.equal(true);
});
it('should return true when absolute URL with subdirectory and local file', function () {
var url = 'http://myblog.com/blog/content/images/2017/07/ghost-logo.png',
result;
urlForStub = sandbox.stub(utils.url, 'urlFor');
urlForStub.withArgs('home').returns('http://myblog.com/');
urlGetSubdirStub = sandbox.stub(utils.url, 'getSubdir');
urlGetSubdirStub.returns('/blog');
result = storageUtils.isLocalImage(url);
should.exist(result);
result.should.be.equal(true);
});
it('should return true when relative URL and local file', function () {
var url = '/content/images/2017/07/ghost-logo.png',
result;
urlForStub = sandbox.stub(utils.url, 'urlFor');
urlForStub.withArgs('home').returns('http://myblog.com/');
urlGetSubdirStub = sandbox.stub(utils.url, 'getSubdir');
urlGetSubdirStub.returns('');
result = storageUtils.isLocalImage(url);
should.exist(result);
result.should.be.equal(true);
});
it('should return true when relative URL and local file', function () {
var url = '/blog/content/images/2017/07/ghost-logo.png',
result;
urlForStub = sandbox.stub(utils.url, 'urlFor');
urlForStub.withArgs('home').returns('http://myblog.com/');
urlGetSubdirStub = sandbox.stub(utils.url, 'getSubdir');
urlGetSubdirStub.returns('/blog');
result = storageUtils.isLocalImage(url);
should.exist(result);
result.should.be.equal(true);
});
it('should return false when no local file', function () {
var url = 'http://somewebsite.com/ghost-logo.png',
result;
urlForStub = sandbox.stub(utils.url, 'urlFor');
urlForStub.withArgs('home').returns('http://myblog.com/');
urlGetSubdirStub = sandbox.stub(utils.url, 'getSubdir');
urlGetSubdirStub.returns('');
result = storageUtils.isLocalImage(url);
should.exist(result);
result.should.be.equal(false);
});
});
});