diff --git a/src/node/utils/caching_middleware.js b/src/node/utils/caching_middleware.js index 6df4faa97..f03e5aa4b 100644 --- a/src/node/utils/caching_middleware.js +++ b/src/node/utils/caching_middleware.js @@ -21,6 +21,7 @@ var path = require('path'); var zlib = require('zlib'); var settings = require('./Settings'); var existsSync = require('./path_exists'); +const url = require('url'); /* * The crypto module can be absent on reduced node installations. @@ -91,8 +92,14 @@ CachingMiddleware.prototype = new function () { var supportsGzip = (req.get('Accept-Encoding') || '').indexOf('gzip') != -1; - var path = require('url').parse(req.url).path; - var cacheKey = generateCacheKey(path); + /** + * `req.url` is either /file?callback=require.define&v=versionString + * or /file. + * + * invalid.invalid is just a placeholder + */ + let path = new url.URL(req.url, 'http://invalid.invalid').pathname; + let cacheKey = generateCacheKey(path); fs.stat(CACHE_DIR + 'minified_' + cacheKey, function (error, stats) { var modifiedSince = (req.headers['if-modified-since'] diff --git a/tests/backend/specs/caching_middleware.js b/tests/backend/specs/caching_middleware.js index a8ff2b615..c7946e8bc 100644 --- a/tests/backend/specs/caching_middleware.js +++ b/tests/backend/specs/caching_middleware.js @@ -9,6 +9,8 @@ const settings = require('../../../src/node/utils/Settings'); const assert = require('assert').strict; const url = require('url'); const queryString = require('querystring'); +const fs = require('fs'); +const path = require('path'); let agent; @@ -165,4 +167,20 @@ describe(__filename, function() { }) }); + context("different callback or version parameter", function(){ + it('should never create new files', async function(){ + const pathToVar = path.join(__filename, '../../../../var'); + + // the number of files in ./var should not change during this test + const minifiedFilesBefore = (await fs.promises.readdir(pathToVar)).length; + const resource1 = "/javascripts/lib/ep_etherpad-lite/static/js/ace2_common.js?callback=require.define"; + const resource2 = "/javascripts/lib/ep_etherpad-lite/static/js/ace2_common.js?callback=require"; + const resource3 = "/javascripts/lib/ep_etherpad-lite/static/js/ace2_common.js?callback=require.define&v=1234"; + await agent.get(resource1); + await agent.get(resource2); + await agent.get(resource3); + const minifiedFilesAfter = (await fs.promises.readdir(pathToVar)).length; + assert.equal(minifiedFilesBefore, minifiedFilesAfter); + }) + }) });