Skip to content

Commit a8546f9

Browse files
committed
Fix incorrect filepath from url, fixes #140 (#142)
* Fix incorrect filepath from url, fixes #140 * Add default filenames for html resources with incorrect extension
1 parent 77e9ccd commit a8546f9

File tree

6 files changed

+42
-10
lines changed

6 files changed

+42
-10
lines changed

lib/config/resource-extensions-by-type.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ var types = require('./resource-types');
22

33
var defaultExtensions = {};
44

5-
defaultExtensions[types.html] = '.html';
6-
defaultExtensions[types.css] = '.css';
5+
defaultExtensions[types.html] = {
6+
defaultExtension: '.html',
7+
possibleExtensions: [ '.html', '.htm' ]
8+
};
9+
defaultExtensions[types.css] = {
10+
defaultExtension: '.css',
11+
possibleExtensions: [ '.css' ]
12+
};
713

814
module.exports = defaultExtensions;

lib/filename-generators/by-site-structure.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
var _ = require('lodash');
22
var path = require('path');
33
var utils = require('../utils');
4+
var resourceTypes = require('../config/resource-types');
5+
var resourceTypeExtensions = require('../config/resource-extensions-by-type');
46

57
module.exports = function generateFilename (resource, options) {
68
var resourceUrl = resource.getUrl();
79
var filePath = utils.getFilepathFromUrl(resourceUrl);
810
var extension = utils.getFilenameExtension(filePath);
911

1012
// If we have HTML from 'http://example.com/path' => set 'path/index.html' as filepath
11-
if (resource.isHtml() && !extension) {
12-
filePath = path.join(filePath, options.defaultFilename);
13+
if (resource.isHtml()) {
14+
var htmlExtensions = resourceTypeExtensions[resourceTypes.html].possibleExtensions;
15+
var resourceHasHtmlExtension = _.includes(htmlExtensions, extension);
16+
// add index.html only if filepath has ext != html '/path/test.com' => '/path/test.com/index.html'
17+
if (!resourceHasHtmlExtension) {
18+
filePath = path.join(filePath, options.defaultFilename);
19+
}
1320
}
1421

1522
return sanitizeFilepath(filePath);

lib/filename-generators/by-type.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
var _ = require('lodash');
22
var path = require('path');
33
var utils = require('../utils.js');
4-
var defaultExtensions = require('../config/resource-extensions-by-type');
4+
var typeExtensions = require('../config/resource-extensions-by-type');
55

66
module.exports = function generateFilename (resource, options, occupiedFileNames) {
77
var occupiedNames = getSubDirectoryNames(options).concat(occupiedFileNames);
@@ -32,8 +32,8 @@ function getFilenameForResource (resource, options) {
3232
var resourceType = resource.getType();
3333
var extension = utils.getFilenameExtension(filename);
3434

35-
if (!extension && defaultExtensions[resourceType]) {
36-
extension = defaultExtensions[resourceType];
35+
if (!extension && typeExtensions[resourceType]) {
36+
extension = typeExtensions[resourceType].defaultExtension;
3737
filename += extension;
3838
}
3939

lib/utils.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,22 @@ function getFilenameFromUrl (u) {
4949
* @returns {string} path
5050
*/
5151
function getFilepathFromUrl (u) {
52-
return url.parse(u).pathname.substring(1);
52+
var normalizedUrl = normalizeUrl(u);
53+
return url.parse(normalizedUrl).pathname.substring(1);
5354
}
5455

5556
function getHashFromUrl (u) {
5657
return url.parse(u).hash || '';
5758
}
5859

59-
function getFilenameExtension (filename) {
60-
return (typeof filename === 'string') ? path.extname(filename) : null;
60+
/**
61+
* Returns extension for given filepath
62+
* Example: some/path/file.js => .js
63+
* @param {string} filepath
64+
* @returns {string|null} - extension
65+
*/
66+
function getFilenameExtension (filepath) {
67+
return (typeof filepath === 'string') ? path.extname(filepath) : null;
6168
}
6269

6370
function shortenFilename (filename) {

test/unit/file-name-generators/by-site-structure-test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ describe('byStructureFilenameGenerator', function() {
3535
bySiteStructureFilenameGenerator(r3, options).should.equalFileSystemPath('index.html');
3636
});
3737

38+
it('should add the defaultFilename to the path, for html resources with wrong extension', function(){
39+
var isHtmlMock = sinon.stub().returns(true);
40+
41+
var r1 = new Resource('http://example.com/some/path/test.com');
42+
r1.isHtml = isHtmlMock;
43+
bySiteStructureFilenameGenerator(r1, options).should.equalFileSystemPath('some/path/test.com/index.html');
44+
});
45+
3846
it('should normalize to safe relative paths, without ..', function(){
3947
var r = new Resource('http://example.com/some/path/../../../../images/a.png');
4048
bySiteStructureFilenameGenerator(r, options).should.equalFileSystemPath('images/a.png');

test/unit/utils-test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ describe('Common utils', function () {
7777
it('should return path including filename if url has pathname', function() {
7878
utils.getFilepathFromUrl('http://example.com/some/path/file.js').should.equal('some/path/file.js');
7979
});
80+
it('should not contain trailing slash', function() {
81+
utils.getFilepathFromUrl('http://example.com/some/path/').should.equal('some/path');
82+
utils.getFilepathFromUrl('http://example.com/some/path/file.css/').should.equal('some/path/file.css');
83+
});
8084
});
8185

8286
describe('#getHashFromUrl', function () {

0 commit comments

Comments
 (0)